1

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

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

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

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

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

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

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

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

谢谢。

4

1 回答 1

1

如果你看一下AuditReaderFactoryhereAuditReaderImpl )的实现,每次调用都会创建一个新的 an 实例;实例本身不会缓存在任何地方。

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

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

于 2013-09-24T07:10:37.147 回答