Tôi hiện đang thử nghiệm với EJB3 như là một uy tín cho một dự án lớn tại nơi làm việc. Một trong những điều tôi đang xem là truy vấn bộ nhớ đệm.Tại sao truy vấn bộ nhớ đệm với Hibernate làm cho truy vấn chậm hơn mười lần?
Tôi đã tạo một mô hình miền rất đơn giản với chú thích JPA, giao diện kinh doanh @Local và triển khai @Stateless trong EJB-JAR, được triển khai trong một EAR cùng với một ứng dụng web rất đơn giản để thực hiện một số thử nghiệm cơ bản. EAR được triển khai trong cấu hình mặc định JBoss 5.0.1 không có sửa đổi. Điều này rất căng thẳng, và làm việc như mong đợi.
Tuy nhiên, thử nghiệm liên quan đến bộ nhớ đệm truy vấn mới nhất của tôi, và tôi đã nhận một số kết quả kỳ lạ:
- Tôi có một lớp miền mà chỉ có bản đồ một ID và một giá trị String, và đã tạo ra khoảng 10.000 hàng trong đó đặc biệt bảng
- trong đậu kinh doanh, có một câu hỏi rất đơn giản, SELECT m TỪ MyClass m
- Khi không có bộ nhớ cache, điều này thực hiện trong khoảng 400ms trung bình
- với bộ nhớ cache truy vấn cho phép (thông qua gợi ý về truy vấn), các việc thực hiện đầu tiên của khóa học mất nhiều thời gian hơn một chút, khoảng 1200ms. Các cuộc hành quyết tiếp theo mất trung bình 3500ms!
Điều này khiến tôi bối rối, vì vậy tôi đã bật show_sql của Hibernate để xem nhật ký. Uncached, và trên thực hiện đầu tiên với bộ nhớ cache được kích hoạt, có một SELECT đăng nhập, như mong đợi. Khi tôi sẽ nhận được truy cập bộ nhớ cache, Hibernate ghi lại một SELECT cho mỗi hàng trong bảng cơ sở dữ liệu.
Điều đó chắc chắn sẽ giải thích thời gian thực hiện chậm, nhưng bất kỳ ai cũng có thể cho tôi biết tại sao điều này xảy ra?
Bạn có thể tìm thấy một số thông tin hữu ích trên blog của tôi về bộ nhớ cache truy vấn tại đây: * http://tech.puredanger.com/2009/07/10/hibernate-query-cache/ –