Tôi đang sử dụng Hibernate EntityManager và đang gặp sự cố chậm chạp trong các truy vấn Hibernate của tôi. Hãy xem mã này:Truy vấn Hibernate chậm lại đáng kể sau khi một thực thể được tải trong phiên
public void testQuerySpeed() {
for(int i = 0; i < 1000; i++) {
em.createNativeQuery("SELECT 1").getResultList();
}
}
Điều này chạy trong khoảng 750ms trên máy tính của tôi. Không rực nhanh chóng xem xét nó chỉ là lựa chọn một số nguyên không đổi, nhưng chấp nhận được. Vấn đề của tôi phát sinh thời điểm bất kỳ thực thể được nạp trong phiên EntityManager tôi trước khi tôi khởi động truy vấn của tôi:
public void testQuerySpeed() {
CommercialContact contact = em.find(CommercialContact.class, 1890871l);
for(int i = 0; i < 1000; i++) {
em.createNativeQuery("SELECT 1").getSingleResult();
}
}
Các em.find() là nhanh, nhưng các truy vấn runtime 1000 tăng hơn mười lần, để khoảng 10 giây. Nếu tôi đặt một số em.clear()
sau em.find()
, sự cố sẽ biến mất một lần nữa và thời gian chạy sẽ quay lại 750ms.
Tôi đã sử dụng truy vấn gốc tại đây, nhưng sự cố vẫn tồn tại với truy vấn HQL. Dường như TẤT CẢ các truy vấn mất ít nhất 70ms bất cứ khi nào một thực thể nằm trong phiên EntityManager.
Việc giảm hiệu suất này thực sự gây tổn hại cho chúng tôi khi tạo danh sách cần có các truy vấn n + 1.
Tôi đã thử nghiệm phiên bản Hibernate 3.5 beta mới nhất và có cùng vấn đề chính xác. Có ai nhìn thấy vấn đề này, hoặc bất kỳ ý tưởng về cách sửa chữa nó?
Tôi đang sử dụng PostgreSQL 8.3, sử dụng các giao dịch tài nguyên cục bộ (chạy trong Tomcat). Sử dụng hồ bơi kết nối tích hợp, nhưng sử dụng C3P0 không có sự khác biệt.
Bạn có hồ sơ không? Phần lớn thời gian được chi tiêu ở đâu? Bạn có bất kỳ trình lắng nghe/kẻ đánh chặn/phương thức gọi lại nào được xác định không? – ChssPly76