几天来我一直在调试代码中的一些奇怪的行为,并偶然发现了一些令我惊讶的事情。我已经确认这不会导致我的问题,但我认为无论如何还是值得检查我的假设。
如果我在单个线程的多个位置获取当前的 Hibernate session (我正在使用线程 session 上下文),我将始终获得相同的 session ,因此我将访问相同的一级缓存。
在获取审计读取器实例时,我假设了与 envers 类似的行为。我正在使用 AuditReader reader = AuditReaderFactory.get(session);
来获取 AuditReader
实例。我注意到每次调用它时(即使在同一 session 上下文中)我都会得到一个新的审核读取器实例,其中包含唯一的一级缓存实例。
看起来这充其量只会导致多个可能重叠的缓存的性能下降。
我曾假设,对于 session 上下文,我总是会获得相同的 AuditReader
实例,因此只有一个一级缓存。我想不出为什么会出现这种情况的原因。
这给我留下了四种可能性:
- 我没有使用正确的方法来获取 session 上下文的审核读取器
- 拥有多个审核读取器实例是有充分理由的
- 恩弗斯深处的某个地方有一个错误
- 重复使用审核读取器实例是没有意义的。
有人可以对此提供一些见解吗?
谢谢。
最佳答案
如果您查看 AuditReaderFactory
( here ) 的实现,就会发现每次调用时都会创建一个 AuditReaderImpl
的新实例;实例本身不会缓存在任何地方。
也没有在任何地方指定您应该在同一 session 中获得相同的实例;因此您的请求可以被视为“功能请求”,但我不会说这是一个错误。
没有特定的理由不重用相同的审核读取器实例。
关于java - 多个 Hibernate envers FirstLevelCache 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18963944/