使用Hibernate作为ORM机制的Web应用程序中的L1和L2缓存有什么区别?

时间:2010-12-14 10:38:35

标签: java hibernate caching orm

我只想了解一些关于使用L1缓存和L2缓存的标准目的的一般信息。

我很好奇,因为我正在调查使用兵马俑作为二级缓存的系统,我发现它也有一级缓存。

6 个答案:

答案 0 :(得分:16)

L1 Cache是​​每个Hibernate会话中存在的缓存,并且此缓存不在线程之间共享。这个缓存利用了Hibernate自己的缓存。

L2缓存是一种超越Hibernate会话的缓存,可以在线程之间共享。对于此缓存,您可以使用Hibernate附带的缓存实现(如EHCache)或其他类似JBossCache2

答案 1 :(得分:3)

在JPA / Hibernate(以及其他类似的ORM工具)中,L1缓存是事务缓存,即从打开事务到关闭事务时存储的实体。这几乎从不是共享缓存(其他线程无法使用它)。在JPA中,这通常由EntityManager保存。

L2缓存是一个完整的(通常)共享缓存。如果您有多个线程/查询引入数据,那么它们可以使用已经由缓存中仍然存在的其他线程检索的实体。在JPA中,这通常由EntityManagerFactory持有。

答案 2 :(得分:2)

GaryF并没有错,但技术上并不正确:-) Anton对此更为正确,但补充他的回答:

第一级缓存:这是一个"缓存"它存储特定会话已知的所有实体。因此,如果您在此会话中有3个交易,它将保留所有三个交易所触及的所有实体。当您关闭会话或执行"清除时,它会被清除。方法。

二级缓存:这是一个真实的"缓存并委托给外部提供商,例如Infinispan。在此缓存中,您可以完全控制缓存的内容,这意味着您可以指定应该逐出哪些条目,哪些条目应该保留更长时间等等。

答案 3 :(得分:0)

如果Hibernate与NHibernate类似(除了相反的方式),Session是第一级缓存。除了它不是一般意义上的缓存,而是身份地图。

答案 4 :(得分:0)

L1默认情况下处于启用状态,您必须添加一些第三方库,例如EH缓存,L2的Redis。

您不能在休眠模式下禁用L1。

答案 5 :(得分:0)

L1:一级缓存是每个 Hibernate Session 缓存的缓存,是所有请求都必须通过的强制缓存,并且该缓存在线程之间不共享。

L2:二级缓存可以在每个类和每个集合的基础上进行配置,主要负责跨会话缓存对象。L2 缓存是一种缓存,可以在 Hibernate 会话之后存活,并且可以在线程之间共享。