我已经在我的代码中调试了一些奇怪的envers行为了几天,并且偶然发现了让我感到惊讶的事情。我已经确认这不会导致我的问题,但我认为无论如何都值得检查我的假设。
如果我在一个线程中的多个位置获得当前的Hibernate会话(我正在使用线程会话上下文),我将始终获得相同的会话,因此我将达到相同级别的一个缓存。
在获取审计读取器实例时,我曾假设与envers类似的行为。我正在使用AuditReader reader = AuditReaderFactory.get(session);
来获取AuditReader
个实例。我注意到每次调用它时(即使在同一个会话上下文中)我都会得到一个新的审计读取器实例,其中包含一个唯一的第一级缓存实例。
看起来这最多会导致多个可能重叠的缓存的性能损失。
我曾经假设,对于会话上下文,我总是会得到相同的AuditReader
实例,因此只有一个第一级缓存。我想不出为什么会出现这种情况的原因。
这给我留下了四种可能性:
有人可以提供一些见解。
感谢。
答案 0 :(得分:1)
如果查看AuditReaderFactory
(here)的实现,则会在每次调用时创建AuditReaderImpl
的新实例;实例不会在任何地方缓存。
在任何地方都没有指定在给定相同会话的情况下应该获得相同的实例;所以你的请求可以被视为“功能请求”,但我不会说这是一个错误。
没有特别的理由不重用相同的审计读者实例。