2010-12-14 29 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的缓存实现。

相关问题