Tôi đã làm theo tất cả các câu trả lời của câu hỏi này để thay đổi mã kế thừa đang hoạt động bằng cách sử dụng - Statement
(nhưng có SQL Tiêm) thành một giải pháp sử dụng PreparedStatement
với mã chậm hơn nhiều do hiểu biết kém về ngữ nghĩa xung quanh Statement.addBatch(String sql)
&PreparedStatement.addBatch()
.
Vì vậy, tôi liệt kê kịch bản của mình ở đây để những người khác không mắc lỗi tương tự.
Kịch bản của tôi là
Statement statement = connection.createStatement();
for (Object object : objectList) {
//Create a query which would be different for each object
// Add this query to statement for batch using - statement.addBatch(query);
}
statement.executeBatch();
Vì vậy, trong đoạn mã trên, tôi có hàng ngàn truy vấn khác nhau, tất cả được thêm vào cùng một câu lệnh và mã này hoạt động nhanh hơn vì các câu lệnh không được lưu trong bộ nhớ cache là tốt và mã này hiếm khi được thực thi trong ứng dụng.
Bây giờ để sửa lỗi SQL, tôi đã thay đổi mã này thành,
List<PreparedStatement> pStatements = new ArrayList<>();
for (Object object : objectList) {
//Create a query which would be different for each object
PreparedStatement pStatement =connection.prepareStatement(query);
// This query can't be added to batch because its a different query so I used list.
//Set parameter to pStatement using object
pStatements.add(pStatement);
}// Object loop
// In place of statement.executeBatch(); , I had to loop around the list & execute each update separately
for (PreparedStatement ps : pStatements) {
ps.executeUpdate();
}
Vì vậy, bạn thấy, tôi đã bắt đầu tạo ra hàng ngàn PreparedStatement
đối tượng và cuối cùng không thể sử dụng theo đợt vì kịch bản của tôi yêu cầu - có hàng ngàn truy vấn CẬP NHẬT hoặc CHERTN và tất cả các truy vấn này đều khác nhau.
Sửa lỗi SQL SQL là bắt buộc mà không phải trả chi phí cho sự suy giảm hiệu năng và tôi không nghĩ rằng điều đó là có thể với PreparedStatement
kịch bản này.
Ngoài ra, khi bạn sử dụng cơ sở xử lý theo khối sẵn có, bạn phải lo lắng về việc chỉ đóng một Tuyên bố nhưng với cách tiếp cận Danh sách này, bạn cần đóng câu lệnh trước khi sử dụng lại, Sử dụng lại Chuẩn bị sẵn sàng