2010-12-14 31 views

回答

0

如果Hibernate與NHibernate類似(除了其他方式),Session是第一級緩存。除了它不是一般意義上的緩存,而是一個身份映射。

2

在JPA/Hibernate(以及其他類似的ORM工具)中,L1高速緩存是事務性高速緩存,即從您打開事務到關閉時存儲的實體。這幾乎從不是共享緩存(其他線程無法使用它)。在JPA中,這通常由EntityManager保存。

L2緩存是一個完整的(通常)共享緩存。如果您有多個線程/查詢提取數據,那麼他們可以使用已被其他線程檢索到的實體,這些線程仍然存在於緩存中。在JPA中,這通常由EntityManagerFactory保存。

1

GaryF是沒有錯的,但在技術上並不正確:-)安東是在這個更正確的,但以補充他的回答:

一級緩存:這是一個「緩存」存儲所有已知的實體由特定的會話。因此,如果您在此會話中有3筆交易,它將持有所有三筆交易觸及的所有實體。它在關閉會話或執行「清除」方法時被清除。

二級緩存:這是一個「真實」緩存並委託給外部提供商,如Infinispan。在這個緩存中,您可以完全控制緩存的內容,這意味着您可以指定哪些條目應該被逐出,哪些應該保留更長時間等等。

+0

對於第一級緩存,緩存滿時會發生什麼?你提到了兩種緩存被清除的情況,但我很確定它在緩存被填滿時根據「上次使用」或類似算法自動清除。否則會發生內存不足異常,或者在該點之後沒有任何內容可以存儲在緩存中。 – KyleM 2013-03-28 16:56:19

+0

您可能希望通過文檔或實驗來檢查這一點,但據我所知,第一級緩存中的條目不會被驅逐。因此,如果您的事務影響了大量數據,那麼您可能確實面臨內存不足異常(如在批處理操作中)。對於這種「邊緣」情況,您可能需要使用StatelessSession(http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/StatelessSession.html)。 – jpkrohling 2013-04-05 06:42:28

8

L1緩存是每個Hibernate會話中存在的緩存,並且該緩存不在線程間共享。這個緩存使用Hibernate自己的緩存。

二級高速緩存是一種超越Hibernate會話存活的高速緩存,可以在線程間共享。對於這個緩存,您可以使用Hibernate附帶的緩存實現,如EHCache或其他類似JBossCache2的緩存實現。

相關問題