【问题标题】:Multiple Hibernate envers FirstLevelCache instances多个 Hibernate 环境 FirstLevelCache 实例
【发布时间】:2013-09-23 16:08:07
【问题描述】:

这几天我一直在调试我的代码中的一些奇怪的环境行为,并且偶然发现了一些让我感到惊讶的东西。我已经确认这不会导致我的问题,但我认为无论如何检查我的假设是值得的。

如果我在单个线程中的多个位置获取当前 Hibernate 会话(我正在使用线程会话上下文),我将始终获得相同的会话,因此我将访问相同的一级缓存。

在获取审计阅读器实例时,我假设与 envers 的行为类似。我正在使用AuditReader reader = AuditReaderFactory.get(session); 获取AuditReader 实例。我注意到每次调用它(即使在同一个会话上下文中)我都会得到一个新的审计读取器实例,其中包含一个唯一的一级缓存实例。

看起来这充其量只会导致多个可能重叠的缓存的性能下降。

我曾假设,对于会话上下文,我将始终获得相同的 AuditReader 实例,因此,我将获得一个一级缓存。我想不出为什么不是这样的原因。

这给我留下了四种可能性:

  1. 我没有使用正确的方法来获取会话上下文的审核阅读器
  2. 拥有多个审计阅读器实例是有充分理由的
  3. 在环境深处的某处存在错误
  4. 重用审计读取器实例没有意义。

有人可以对此提供一些见解吗?

谢谢。

【问题讨论】:

  • 会话如何绑定到线程以及您如何从中读取...我知道这是一项简单的任务,但出现了大问题...换句话说,请分享代码有问题。
  • @AnanthaSharma 我有一个SessionFactory 的静态实例并使用final Session session = sessionFactory.getCurrentSession() 获取当前的Hibernate 上下文会话。
  • 你如何将 Session 绑定到线程并访问它.. 那里可能有问题..
  • 嗨@AnanthaSharma 我不确定你的意思。我要离开 Hibernate 来管理会话上下文。我只是通过将配置属性hibernate.current_session_context_class 设置为thread 来提名线程上下文管理

标签: java hibernate hibernate-envers


【解决方案1】:

如果您查看AuditReaderFactory (here) 的实现,每次调用都会创建一个AuditReaderImpl 的新实例;实例本身不会缓存在任何地方。

也没有指定在给定相同会话的情况下应该获得相同实例的任何地方;所以您的请求可以被视为“功能请求”,但我不会说这是一个错误。

没有特定理由不重复使用相同的审核阅读器实例。

【讨论】:

  • 谢谢@adamw 我会记住这一点。事实上,更多地考虑这一点,历史实体的一级缓存与当前实体的一级缓存非常不同,因为历史实体是不可变的。因此,无论会话如何,都可以为历史实体考虑单个缓存,这需要老化策略。考虑到这一点,坚持当前的策略可能要容易得多:)
猜你喜欢
  • 2021-01-25
  • 2016-05-16
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 2022-07-30
  • 2011-04-05
  • 1970-01-01
相关资源
最近更新 更多