Tôi đã phát hiện ra một vấn đề hiệu suất với các truy vấn gốc và ngủ đông trên Oracle. Khi tôi thực hiện một truy vấn SQL phức tạp với một số tham số trên TOAD, tôi nhận được kết quả theo mili giây. Tuy nhiên, khi tôi thực hiện cùng một truy vấn bằng cách sử dụng Hibernate thời gian này được tăng lên rất nhiều (lên đến bốn giây hoặc thậm chí nhiều hơn).Hiệu suất chậm trên Hibernate + Java nhưng nhanh khi tôi sử dụng TOAD với cùng một truy vấn Oracle gốc
Truy vấn SQL của tôi khá phức tạp, trả về một giá trị duy nhất (do đó, vấn đề không liên quan đến thời gian cần thiết cho các lớp instation) và nó chứa một số tham số với định dạng ': nameParameter'. Truy vấn này được lưu trữ trong một String. Ví dụ:
String myNamedNativeQuery = "select count(*) from tables "+
"where column1 = :nameParameter1 "+
"and column2 = :nameParameter2";
//actually my sentence is much more complex!!
Khi tôi thực thi câu trên TOAD, nó được giải quyết sau vài miligiây. Nhưng sử dụng câu này với Hibernate
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult();
là cần thiết vài giây để có được kết quả tương tự.
Tôi nhận ra nếu tôi thay thế các tham số trực tiếp trên truy vấn gốc và sau đó tôi thực thi câu bằng Hibernate thời gian giảm đáng kể. Nó sẽ là một cái gì đó như thế:
String strQuery = session.getNamedQuery("myNamedNativeQuery").getQueryString();
myNamedNativeQuery = myNamedNativeQuery.replace("nameParameter1", value1);
myNamedNativeQuery = myNamedNativeQuery.replace("nameParameter2", value2);
SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.uniqueResult();
Bất kỳ ai biết điều gì đang xảy ra?
Xin cảm ơn trước.
PS: Phiên bản Oracle là 9i và Hibernate 3.2
lần lượt tùy chọn "hiển thị sql" với chế độ ngủ đông. Nó sẽ cho bạn thấy truy vấn mà hibernate đang chạy và sẽ cung cấp cho bạn thông tin chi tiết về lý do tại sao quá trình này mất quá nhiều thời gian. –