2012-01-24 37 views
6

Tôi đã trải qua hibernate và các tình huống khi sử dụng Criteria vs HQL và sự hiểu biết của tôi là với Hibernate, mỗi khi chúng tôi đang truy vấn cơ sở dữ liệu hoặc Criteria hoặc HQL trong cả hai trường hợp ngủ đông sẽ nhận được kết quả thiết lập và đưa vào bộ nhớ và sau đó khi chúng tôi gọi đó truy vấn một lần nữa, dữ liệu sẽ được lấy từ bộ nhớ thay vì sau đó nhấn cơ sở dữ liệu đó, là sự hiểu biết của tôi đúng chưa? Cũng như bạn có thể thấy từ bình luận cho câu hỏi được đề cập dưới đây, nó đã được gợi ý rằng tiêu chuẩn Hibernate sẽ nhận dữ liệu từ phiên và HQL sẽ luôn đi và nhấn cơ sở dữ liệu và vì vậy bất kỳ số lượng nhiều cuộc gọi đến truy vấn HQL sẽ đi và nhấn cơ sở dữ liệu và nếu trường hợp này xảy ra thì HQL sẽ gây ra nhiều vấn đề hơn là giải quyết.Truy vấn HQL có luôn truy cập cơ sở dữ liệu và nhận kết quả không?

Vui lòng tư vấn về điều này như một chút nhầm lẫn với tình huống.

Tham chiếu đến question

Trả lời

7

Nó phụ thuộc vào loại truy vấn bạn đang làm và về thiết lập bộ nhớ cache.

Hibernate có ba loại cache: bộ nhớ cache phiên, bộ nhớ cache truy vấn và bộ nhớ cache cấp 2. Bộ nhớ cache phiên luôn bật nhưng hai chế độ còn lại có thể bị tắt.

Thông thường, bộ nhớ đệm không phải là lý do để ưu tiên API tiêu chí trên HQL hoặc ngược lại. Chúng chủ yếu chỉ là các giao diện khác nhau về cơ bản giống nhau.

Xem http://www.javalobby.org/java/forums/t48846.htmlhttp://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html

+1

AFAIK truy vấn HQL sẽ chỉ sử dụng bộ nhớ truy vấn và chỉ nhận kết quả từ đó nếu truy vấn và tất cả các thông số giống nhau. – Thomas

+0

vì vậy nếu sáng tạo '" từ "+ test.class.getName() + SORT_BY_ID;', làm cách nào tôi có thể quyết định xem nó có đang đánh vào bộ nhớ hoặc cơ sở dữ liệu hay không, cũng như thế nào chúng ta có thể quản lý các thiết lập bộ đệm trong hibernate v3.2? – Rachel

+0

@Juha: vì vậy bây giờ khi bạn nói phiên là theo mặc định luôn luôn trên sau đó HQL sẽ nhận được kết quả trở lại từ phiên phải và không nhấn cơ sở dữ liệu một lần nữa phải không? – Rachel

1

Về cơ bản nếu bạn đang tạo ra các truy vấn có thể là bạn đang đi để đạt cơ sở dữ liệu, các ngoại lệ là nếu bạn đã lưu trữ truy vấn và các thông số.

Truy vấn ngủ đông (cho dù bạn sử dụng Tiêu chí hoặc HQL) sẽ chỉ trả về các thực thể từ bộ nhớ cache phiên (bộ đệm cấp đầu tiên) nếu bạn nhận được nó bằng @Id.

Để cache một truy vấn mà bạn có thể sử dụng cú pháp sau:

session.createQuery("from X as x").setCacheable(true); 

Edited để lấy ý kiến:

Truy vấn là không giống như một nhận được với @ id. Để nhận một đối tượng bằng @Id, bạn sẽ viết một cái gì đó như:

Entity myEntity = sessionFactory.getCurrentSession().get(Entity.class, 1); 
+0

bạn có thể đưa ra ví dụ về các truy vấn ngủ đông được nhận bằng '@ Id' – Rachel

+0

Một cái gì đó như thế này sử dụng HQL để tìm nạp khóa chính (@Id) session.createQuery (" từ Entity e trong đó e.id =? ") .setParameter (1, id) –

+0

Thao tác này sẽ không truy cập bộ nhớ cache phiên. Bạn đang tạo truy vấn sẽ bỏ qua bộ nhớ cache phiên và chuyển thẳng đến cơ sở dữ liệu. Nếu bạn muốn tìm nạp bằng @Id, hãy sử dụng Tải hoặc Lấy trên phiên. –

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