java - 多个 Hibernate envers FirstLevelCache 实例

标签 java hibernate hibernate-envers

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

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

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

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

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

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

  1. 我没有使用正确的方法来获取 session 上下文的审核读取器
  2. 拥有多个审核读取器实例是有充分理由的
  3. 恩弗斯深处的某个地方有一个错误
  4. 重复使用审核读取器实例是没有意义的。

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

谢谢。

最佳答案

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

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

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

关于java - 多个 Hibernate envers FirstLevelCache 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18963944/

相关文章:

java - 如何识别 PMD 规则中的换行符

java - 通过反射像调用静态方法一样调用实例方法

java - 在java中打印元音数量最多的单词

java - 如何获取高超音速中的表列表

java - org.hibernate.exception.SQLGrammarException : could not prepare statement -- Spring ROO

java - Hibernate/hsqldb 2 无法水合 Blob 列

java - 如何在 hibernate 中本地修改实体?

java - Hibernate Envers - DefaultRevisionEntity 无法转换为 javassist.util.proxy.Proxy

hibernate - 将 Envers 添加到现有数据库

java - 当构造函数具有类的类型时,这意味着什么?