【发布时间】:2017-01-28 10:29:01
【问题描述】:
当我们使用 Hazelcast 作为缓存提供者时,我们发现 Hibernate 查询缓存存在一个奇怪的问题。这是我们的设置:
- Hazelcast 3.6.5 与 hazelcast-hibernate4
- 休眠 4.3.10
- 集群中有 3 台服务器
persistence.xml 中的配置:
<properties>
<property name="javax.persistence.sharedCache.mode" value="DISABLE_SELECTIVE"/>
<property name="hibernate.cache.region_prefix" value="custom-pu"/>
<property name="hibernate.enable_lazy_load_no_trans" value="true"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
<property name="hibernate.default_batch_fetch_size" value="50"/>
<property name="hibernate.jdbc.batch_size" value="50"/>
<property name="hibernate.event.merge.entity_copy_observer" value="log"/>
<property name="hibernate.session_factory_name" value="customSessionFactory"/>
<property name="hibernate.cache.hazelcast.configuration_file_path"
value="${config.dir}/custom-hazelcast.xml"/>
<property name="hibernate.cache.hazelcast.instance_name" value="customInstance"/>
<property name="hibernate.cache.hazelcast.use_native_client" value="false"/>
<property name="hibernate.cache.region.factory_class"
value="com.hazelcast.hibernate.HazelcastLocalCacheRegionFactory"/>
<property name="hibernate.cache.hazelcast.shutdown_on_session_factory_close" value="false"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="javax.persistence.validation.group.pre-persist" value="javax.validation.groups.Default"/>
<property name="javax.persistence.validation.group.pre-update" value="javax.validation.groups.Default"/>
</properties>
有时用户更新了一些数据,而同一节点或另一个节点上的用户看不到更新 - 没有针对数据库发送 SQL 查询(如日志中所观察到的)。清除一个节点上的查询缓存会导致所有节点从数据库请求新数据。
我们首先通过数据库视图支持的实体列表观察到这一点,但是视图正确地使用@Synchronized 进行了注释,并且我们在调试期间看到 Hibernate 正确地检查了提到的表的区域。如果查询缓存停止工作,缓存超时(在 hazelcast.xml 中配置)会导致最终显示正确的结果。
挖掘日志,我们看到一旦查询缓存停止工作,时间戳缓存会报告@Synchronized 中提到的区域的缓存数据比查询缓存结果旧,因此 Hibernate 不会丢弃旧条目并请求新条目数据。
我现在多次检查persistence.xml中的配置,发现我们没有激活这个属性:hibernate.cache.use_minimal_puts——这会有所不同吗(我当然可以简单地应用它,但我想知道为什么这将解决我们的问题)。
我们在这里不知所措,因为我们不知道如何正确重现问题,也不知道是什么原因造成的。此外,来自 Hazelcast 的休眠缓存集成不是很冗长,因此很难看到发生了什么......
提前致谢!
【问题讨论】:
标签: hibernate caching hazelcast