2012-08-15 34 views
5

Để làm rõ: Tôi biết rằng việc tạo PreparedStatement ngoài vòng lặp là điều đúng đắn. Tôi đã hỏi câu hỏi này chỉ vì tò mò.Tạo một tuyên bố đã chuẩn bị bên trong một vòng lặp


Giả sử rằng tôi đang tạo một PreparedStatement bên trong vòng lặp luôn có cùng truy vấn SQL.

final String sql = "INSERT INTO ..."; 
while (condition) { 
    ... 
    PreparedStatement statement = connection.prepareStatement(sql); 
    // Fill values of the prepared statement 
    // Execute statement 
    ... 
} 

Điều này có vô dụng vì đối tượng PreparedStatement luôn được tạo lại? Hoặc cơ sở dữ liệu bên dưới có nhận ra rằng nó luôn là truy vấn SQL tương tự mà PreparedStatement được tạo ra và sử dụng lại nó?

+0

Tại sao bạn đang tạo t anh ta 'PreparedStatement' bên trong vòng lặp? Đặt việc tạo ra bên ngoài vòng lặp và tái sử dụng nó trong vòng lặp. – Jesper

+2

Điểm của câu lệnh chuẩn bị là chuẩn bị một lần và sử dụng nó nhiều lần. Việc triển khai thực tế có thể lên đến trình điều khiển, nhưng bạn phải kiểm tra thông số kỹ thuật để xem liệu có bất kỳ quy tắc thực tế nào liên quan đến điều này hay không. –

+0

@ Jesper Tôi biết rằng nên tạo vòng lặp đó tốt hơn. Tôi vừa mới hỏi câu hỏi này từ tò mò. :-) –

Trả lời

1

Một số trình điều khiển làm các câu lệnh chuẩn bị bộ nhớ cache, vâng. Ví dụ, lướt qua tài liệu Oracle này: http://docs.oracle.com/cd/B10501_01/java.920/a96654/stmtcach.htm

Tôi không tin rằng điều này có thể đúng với tất cả các trình điều khiển, mặc dù chắc chắn nó có vẻ giống như một tính năng của nhiều trình điều khiển JDBC. Có vẻ như MySQL có thể không làm điều này: How to use MySQL prepared statement caching?

Điều đó nói rằng, nếu bạn thực sự muốn sử dụng báo cáo đã chuẩn bị hiệu quả, có vẻ như treo trên một ví dụ của câu lệnh chuẩn bị mà bạn sử dụng trên mỗi vòng lặp lặp lại Ý nghĩa hơn.

+0

+1 để cung cấp tài liệu của Oracle –

8

1. Nếu bạn đang sử dụng cùngPreparedStatement suốt vòng, sau đó của nó tốt hơn bạn giữPreparedStatementbên ngoài vòng lặp.

2. Nếu bạn có chỉ số sql tiếp tục thay đổi bên trong vòng lặp, thì chỉ sử dụng giá trị của nó trong vòng lặp.

3. Hơn nữa nếu giữ nó thay đổi, sau đó chỉ cần sử dụng Statementthay vìPreparedStatement, khác mục đích rất PreparedStatement bị mất khi bạn tiếp tục thay đổi nó.

1

Hai cách cho đến nay tôi biết.

1st Way

nó chèn bản ghi từng người một

final String sql = "INSERT INTO tablename(columnname) Values(?)"; 

PreparedStatement statement = connection.prepareStatement(sql); 

while (condition) { 
statement.setString(1,value); 
statement.executeUpdate(); 
} 

(hoặc)

Cách 2

Nó chèn tất cả các kỷ lục như số lượng lớn chèn

final String sql = "INSERT INTO tablename(columnname) Values(?)"; 

PreparedStatement statement = connection.prepareStatement(sql); 

while (condition) { 
statement.setString(1,value); 
statement.addBatch(); 
} 

statement.executeBatch(); 
Các vấn đề liên quan