【发布时间】:2013-09-23 16:08:07
【问题描述】:
这几天我一直在调试我的代码中的一些奇怪的环境行为,并且偶然发现了一些让我感到惊讶的东西。我已经确认这不会导致我的问题,但我认为无论如何检查我的假设是值得的。
如果我在单个线程中的多个位置获取当前 Hibernate 会话(我正在使用线程会话上下文),我将始终获得相同的会话,因此我将访问相同的一级缓存。
在获取审计阅读器实例时,我假设与 envers 的行为类似。我正在使用AuditReader reader = AuditReaderFactory.get(session); 获取AuditReader 实例。我注意到每次调用它(即使在同一个会话上下文中)我都会得到一个新的审计读取器实例,其中包含一个唯一的一级缓存实例。
看起来这充其量只会导致多个可能重叠的缓存的性能下降。
我曾假设,对于会话上下文,我将始终获得相同的 AuditReader 实例,因此,我将获得一个一级缓存。我想不出为什么不是这样的原因。
这给我留下了四种可能性:
- 我没有使用正确的方法来获取会话上下文的审核阅读器
- 拥有多个审计阅读器实例是有充分理由的
- 在环境深处的某处存在错误
- 重用审计读取器实例没有意义。
有人可以对此提供一些见解吗?
谢谢。
【问题讨论】:
-
会话如何绑定到线程以及您如何从中读取...我知道这是一项简单的任务,但出现了大问题...换句话说,请分享代码有问题。
-
@AnanthaSharma 我有一个
SessionFactory的静态实例并使用final Session session = sessionFactory.getCurrentSession()获取当前的Hibernate 上下文会话。 -
你如何将 Session 绑定到线程并访问它.. 那里可能有问题..
-
嗨@AnanthaSharma 我不确定你的意思。我要离开 Hibernate 来管理会话上下文。我只是通过将配置属性
hibernate.current_session_context_class设置为thread来提名线程上下文管理
标签: java hibernate hibernate-envers