当前位置: 首页 > 面试题库 >

休眠缓存策略

任昊苍
2023-03-14
问题内容

我该如何决定CacheConcurrencyStrategy使用哪个?

  • NonstrictReadWriteCache
  • ReadOnlyCache
  • ReadWriteCache
  • TransactionalCache

我阅读了https://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/CacheConcurrencyStrategy.html,但没有足够详细地解释。


问题答案:

在Hibernate文档确实在他们定义了很好的工作:

19.2.2。策略:只读

如果您的应用程序需要读取而不是修改持久类的实例,则可以使用只读缓存。这是最简单和最佳的执行策略。在群集中使用它甚至是安全的。

19.2.3。策略:读/写

如果应用程序需要更新数据,则可以使用读写缓存。如果需要可序列化的事务隔离级别,则永远不要使用此缓存策略。如果在JTA环境中使用了缓存,则必须指定属性
hibernate.transaction.manager_lookup_class
并命名用于获取JTA的策略TransactionManager。在其他环境中,应确保在调用Session.close()或 时完成事务
Session.disconnect()。如果要在群集中使用此策略,则应确保基础缓存实现支持锁定。内置的缓存提供程序不支持锁定。


19.2.4。策略:非严格读/写

如果应用程序仅偶尔需要更新数据(即,如果两个事务很难同时尝试更新同一项),并且不需要严格的事务隔离,则非严格读写缓存可能是合适的。如果在JTA环境中使用了缓存,则必须指定
hibernate.transaction.manager_lookup_class。在其他环境中,应确保在调用Session.close()
时完成事务Session.disconnect()

19.2.5。策略:事务性

事务缓存策略为完全事务缓存提供程序(例如JBoss TreeCache)提供支持。这样的缓存只能在JTA环境中使用,必须指定
hibernate.transaction.manager_lookup_class

换一种说法:

  • 只读:经常读取但从未更新的 数据很有用(例如,参考数据,如“国家”)。很简单。它拥有所有最佳性能(显然)。

  • 读/写: 如果您的数据需要 更新,则是 理想的。但是它不提供SERIALIZABLE隔离级别,可能会发生幻像读取(您可能会在事务结束时看到开始时不存在的某些内容)。它比只读具有更多的开销。

  • 非严格读/写: 或者,如果不太可能两个单独的事务线程可以更新同一对象,则可以使用非严格读/写策略。它比读写具有更少的开销。这对于 很少更新的 数据很有用。

  • 事务性: 如果您需要 完全事务性 缓存。仅适用于JTA环境。

因此,选择正确的策略取决于是否要更新数据,更新的频率和所需的隔离级别。如果您不知道如何回答要放入高速缓存中的数据的这些问题,请咨询DBA。



 类似资料:
  • 问题内容: 一级缓存与hibernate中的查询缓存是否不同?我看过有关第一级和查询缓存的文章,所以我很困惑。 问题答案: 默认情况下,第一级缓存处于启用状态,并且基于每个会话。默认情况下,查询缓存未启用,它在多个会话之间共享,应始终与二级缓存一起使用。 要启用查询缓存,应使用以下属性:

  • 问题内容: 在我的Spring驱动的应用程序中,我使用Hibernate(4.2.15.Final)和EhCache(2.6.9)作为第二级缓存,在标准的持久层中进行了设置。 一切正常。但是,将条目放入第二级缓存有时会花费一些时间。 我已经在一个显式文件中配置了域模型类的缓存(我没有配置默认缓存): 在持久性上下文启动时,我收到以下INFO消息记录: 以及执行期间的以下警告 AFAIK 必须调整放

  • 问题内容: 我正在使用Spring + JPA + Hibernate。我正在尝试启用Hibernate的二级缓存。在我的春天,我有: 运行时出现错误: 所以有人抱怨我没有启用二级缓存。我试图通过添加到我的启用它: 但是仍然没有喜悦。我还尝试将其添加到ehcache.xml中: 但这仍然行不通。将更改为也无济于事: 我的实体类被注释为使用缓存 那么,如何启用二级缓存? 编辑: 这是在bean下:

  • 问题内容: 我正在“事务化”一些广泛的数据库操作,并且遇到了以下问题:如果我通过hibernate模式运行sql查询,但未使用MQL方法,则数据库视图似乎不正确。具体来说,在大多数情况下,代码以更适当的方式使用hibernate模式,但是在某些地方,有人决定只执行sql。我不喜欢他们这样做,但是在这一点上“这就是事实”。 我发现了一个解释,这似乎解释,但所有的示例都是WRT实际上得到和管理代码交易

  • 问题内容: 我知道一个事实,它是 Hibernate 使用的一级缓存,一旦我们从中检索到一个实体,就会从而不是从DB中获取对具有 相同标识符 的 同一实体 的后续get调用,直到is Open 为止。 话虽如此,我对休眠如何将第一级缓存与数据库同步感到怀疑吗?考虑以下情形 所以我的问题是 由于是从一级缓存中提取的,因此有更新的值吗? 如果在会话打开时有人直接更新DB并修改User对象,那么是否与D

  • 问题内容: 我有3个非抽象的可持久类。MyClubUser和HisClubUser类从User类继承。对于每个类,我为每个子类策略使用一张表。 我观察到的是,当我对User类进行查询时,生成的SQL使用左外部联接HisClubUser和MyClubUser。为什么Hibernate在我仅关注User的情况下[加入其他表]?我的观点是,即使检索到数据,鉴于返回了用户实例,我也无法访问MyClubUs