2012-08-28 12 views
5

Tôi đang sử dụng Spring NamedParameterJdbcTemplate để tìm nạp một số giá trị từ một bảng. Đối với một số lý do, truy vấn chạy rất chậm trong ứng dụng Java của tôi như trái ngược với việc chạy cùng một truy vấn trên SQL Management Studio. Tôi cũng nhận thấy trong hồ sơ, các báo cáo chuẩn bị không được tái sử dụng. Nếu tôi chạy cùng một truy vấn trong ứng dụng JAVA của tôi nhiều lần, tôi thấy các câu lệnh chuẩn bị khác nhau đang được thực thi. Vì vậy, không chắc chắn lý do tại sao các báo cáo không được tái sử dụng. Hiệu năng có chậm không vì tôi đang sử dụng mệnh đề IN trong truy vấn của mình?Spring NamedParameterJDBCTiếp tục sử dụng lại các câu lệnh đã chuẩn bị

Đây là mẫu java mã của tôi

StringBuilder vQuery = new StringBuilder(); 
vQuery.append(" SELECT SUM(Qty) FROM vDemand"); 
vQuery.append(" WHERE ProductID = :ProductID"); 
vQuery.append(" AND [Date] >= :StartDate AND [Date] <= :EndDate"); 
vQuery.append(" AND CustomerID IN (:CustomerID)"); 

MapSqlParameterSource vNamedParameters = new MapSqlParameterSource(); 
vNamedParameters.addValue("ProductID", aProductID); 
vNamedParameters.addValue("CustomerID", aCustomerlIDs); 
vNamedParameters.addValue("StartDate", aDate, Types.TIMESTAMP); 
vNamedParameters.addValue("EndDate", aDate, Types.TIMESTAMP); 

int vTotalQuantity = this.getNamedParameterJdbcTemplate().queryForInt(vQuery.toString(), vNamedParameters); 
return vTotalQuantity; 

Trả lời

9

Nhìn vào mã nguồn của Spring NamedParameterJdbcTemplate, nó phân tích SQL của bạn thành một cấu trúc ParsedSql, và sau đó thay thế tên thông số của bạn với dấu hỏi, sau đó xây dựng các PreparedStatement và điền nó với các thông số của bạn.

Nó lưu trữ các mục nhập ParsedSql, nhưng luôn xây dựng mới PreparedStatements để cuối cùng chúng không được tái sử dụng ở cấp trình điều khiển JDBC.

Một PreparedStatement có hai ưu điểm so với một thường xuyên Statement:

  1. Bạn thêm các thông số cho SQL sử dụng phương pháp thay vì làm nó bên trong truy vấn SQL chính nó. Với điều này, bạn tránh các cuộc tấn công SQL injection và cũng để cho trình điều khiển thực hiện chuyển đổi kiểu cho bạn.

  2. Như bạn đã nói, cùng một PreparedStatement có thể được gọi với các tham số khác nhau và công cụ cơ sở dữ liệu có thể sử dụng lại kế hoạch thực hiện truy vấn.

Dường như NamedParameterJdbcTemplate giúp bạn có lợi thế đầu tiên, nhưng không làm gì cho sau này.

+0

Thanks.Điều lạ tôi thấy là ngay cả đối với một truy vấn duy nhất, thời gian chạy là khoảng 50 lần nhiều hơn thời gian chạy trong studio quản lý máy chủ sql. Tôi sẽ cố gắng loại bỏ các tham số đã đặt tên và xem liệu sql thẳng có khắc phục được sự cố không. cảm ơn một lần nữa. – user320587

+2

Tôi nghĩ rằng đó là một vấn đề khác, hãy kiểm tra cấu hình trình điều khiển jdbc của bạn. Tạo một dự án mới với trình điều khiển và phương thức chính chỉ thực hiện truy vấn, sql đơn giản. 50 lần chậm hơn là quá nhiều. – Luciano

Các vấn đề liên quan