2010-12-14 35 views

Trả lời

0

Nếu Hibernate là bất kỳ thứ gì tương tự như NHibernate (có nghĩa là, ngoại trừ vòng khác), Session là bộ nhớ cache cấp một. Ngoại trừ việc nó không phải là bộ nhớ đệm theo nghĩa chung, mà là một bản đồ nhận dạng.

2

Trong JPA/Hibernate (và các công cụ ORM tương tự khác), bộ đệm L1 là bộ nhớ cache giao dịch tức là các thực thể được lưu trữ khi bạn mở giao dịch khi bạn đóng nó. Điều này gần như không bao giờ là một bộ nhớ đệm dùng chung (các chủ đề khác không thể sử dụng nó). Trong JPA, điều này thường được tổ chức bởi EntityManager.

Bộ nhớ cache L2 là bộ đệm dùng chung đầy đủ (thường). Nếu bạn có nhiều luồng/truy vấn kéo vào dữ liệu, thì chúng có thể sử dụng các thực thể đã được truy xuất bởi các luồng khác vẫn còn trong bộ đệm ẩn. Trong JPA, điều này thường được tổ chức bởi EntityManagerFactory.

1

GaryF là không sai, nhưng không phải là về mặt kỹ thuật đúng :-) Anton là chính xác hơn về vấn đề này, nhưng để bổ sung cho câu trả lời của mình:

Đầu Cấp Cache: đây là một "bộ nhớ cache" mà các cửa hàng tất cả các đối tượng được biết đến theo một phiên cụ thể. Vì vậy, nếu bạn có 3 giao dịch trong phiên này, nó sẽ giữ tất cả các thực thể được chạm vào bởi cả ba giao dịch. Nó sẽ bị xóa khi bạn đóng phiên hoặc khi bạn thực hiện phương thức "rõ ràng".

Bộ nhớ cache cấp hai: đây là bộ nhớ cache "thực" và được ủy quyền cho nhà cung cấp bên ngoài, chẳng hạn như Infinispan. Trong bộ nhớ cache này, bạn có toàn quyền kiểm soát nội dung của bộ nhớ cache, nghĩa là bạn có thể chỉ định những mục nào cần được loại bỏ, những mục nào sẽ được giữ lại lâu hơn và cứ thế tiếp tục.

+0

Đối với bộ nhớ cache cấp đầu tiên, điều gì sẽ xảy ra khi bộ nhớ cache đầy? Bạn đã đề cập đến hai trường hợp mà bộ nhớ cache bị xóa nhưng tôi chắc chắn nó sẽ tự động bị xóa theo thuật toán "được sử dụng lần cuối" hoặc tương tự khi bộ nhớ cache được lấp đầy. Nếu không, một ngoại lệ bộ nhớ sẽ xảy ra, hoặc không có gì có thể lưu trữ trong bộ nhớ cache sau thời điểm đó. – KyleM

+0

Bạn có thể muốn kiểm tra điều này bằng tài liệu hoặc bằng cách thử nghiệm chính mình, nhưng theo như tôi nhớ, các mục nhập trên bộ nhớ cache cấp đầu tiên sẽ không bao giờ bị xóa. Vì vậy, nếu bạn có một giao dịch ảnh hưởng đến một lượng lớn dữ liệu, bạn có thể thực sự phải đối mặt với một ngoại lệ Out of Memory (như trong các hoạt động hàng loạt). Đối với trường hợp "cạnh" này, bạn có thể muốn sử dụng StatelessSession (http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/StatelessSession.html). – jpkrohling

8

L1 Cache là bộ nhớ cache tồn tại trên mỗi phiên Hibernate và bộ nhớ cache này không được chia sẻ giữa các chuỗi. Bộ nhớ đệm này sử dụng bộ nhớ đệm của Hibernate.

L2 Cache là bộ nhớ cache tồn tại ngoài phiên Hibernate và có thể được chia sẻ giữa các chuỗi. Đối với bộ nhớ cache này, bạn có thể sử dụng bộ đệm ẩn có sẵn với Hibernate như EHCache hoặc một cái gì đó khác như JBossCache2

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