【问题标题】:Hibernate + Hazelcast Query Cache not refreshing sometimesHibernate + Hazelcast 查询缓存有时不刷新
【发布时间】: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


    【解决方案1】:

    Hibernate 仅提供二级缓存 SPI。 Ehcache 模块由 Ehcache 团队维护,与 Infinispan 和 Hazelcast 相同,因此 Hazelcast 团队的人可能知道导致此问题的原因。

    既然您询问了hibernate.cache.use_minimal_puts,我将回答您的这部分问题。此配置属性优化了二级缓存操作以最大程度地减少写入,同时您为更频繁的读取付出了代价。

    此设置对集群缓存很有用,因此 Hazelcast 可能会从中受益。通常,二级缓存提供程序会自动为集群环境启用它。

    【讨论】:

      猜你喜欢
      • 2020-07-22
      • 2014-08-17
      • 1970-01-01
      • 2013-02-15
      • 2023-03-23
      • 1970-01-01
      • 2018-06-09
      • 2016-03-24
      • 2014-09-11
      相关资源
      最近更新 更多