当前位置: 首页 > 知识库问答 >
问题:

在集群中使用infinispan无效缓存Hibernate

孔波
2023-03-14

我在集群环境中使用Hibernate 5.4.22和Infinispan 11.0.4。Hibernate二级缓存配置为使用JCache提供程序:

    hbProps.setProperty("hibernate.cache.use_minimal_puts", "false");
    hbProps.setProperty("hibernate.cache.use_structured_entries", "false");
    hbProps.setProperty("hibernate.cache.use_query_cache", "false");
    hbProps.setProperty("hibernate.cache.use_second_level_cache", "true");
    hbProps.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.jcache.JCacheRegionFactory");
    hbProps.setProperty("hibernate.javax.cache.provider", "org.infinispan.jcache.embedded.JCachingProvider");

Infinispan由以下Infinispan.xml配置:

<infinispan
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="urn:infinispan:config:11.0 http://www.infinispan.org/schemas/infinispan-config-11.0.xsd"
      xmlns="urn:infinispan:config:11.0">
      
      <jgroups>
          <stack name="jgroups-stack">
              <TCP bind_port="7800"
                   recv_buf_size="${tcp.recv_buf_size:130k}"
                   send_buf_size="${tcp.send_buf_size:130k}"
                   max_bundle_size="64K"
                   sock_conn_timeout="300"
          
                   thread_pool.min_threads="0"
                   thread_pool.max_threads="20"
                   thread_pool.keep_alive_time="30000"/>
          
<!--              <TCPPING async_discovery="true"
                       initial_hosts="${jgroups.tcpping.initial_hosts:localhost[7800],localhost[7801]}"
                       port_range="2"/>-->
              <MPING/>
              <MERGE3  min_interval="10000"
                       max_interval="30000"/>
              <FD_SOCK/>
              <FD_ALL timeout="9000" interval="3000" />
              <VERIFY_SUSPECT timeout="1500"  />
              <BARRIER />
              <pbcast.NAKACK2 use_mcast_xmit="false"
                             discard_delivered_msgs="true"/>
              <UNICAST3 />
              <pbcast.STABLE desired_avg_gossip="50000"
                             max_bytes="4M"/>
              <pbcast.GMS print_local_addr="false" join_timeout="2000"/>
              <UFC max_credits="2M"
                   min_threshold="0.4"/>
              <MFC max_credits="2M"
                   min_threshold="0.4"/>
              <FRAG2 frag_size="60K"  />
              <!--RSVP resend_interval="2000" timeout="10000"/-->
              <pbcast.STATE_TRANSFER/>                    
          </stack>
      </jgroups> 
      
      <cache-container>
          <!-- turn off metrics -->
          <metrics gauges="false" histograms="false"/>
          <jmx enabled="true"/>
          <transport stack="jgroups-stack" cluster="infinispan-hibernate-cluster"/>
          
          <serialization marshaller="org.infinispan.commons.marshall.JavaSerializationMarshaller">
            <white-list>
              <regex>.*</regex>
            </white-list>   
          </serialization>
          
<!--          <replicated-cache name="MainCache" mode="SYNC"> 
            <memory max-count="100000"/>
            <expiration max-idle="3600000" lifespan="-1"/>
          </replicated-cache>-->

          <invalidation-cache name="MainCache" mode="SYNC">
            <memory max-count="100000"/>
            <expiration max-idle="3600000" lifespan="-1"/>
          </invalidation-cache>
      </cache-container>
</infinispan>

我有一个测试实体“配置文件”,它应该用读写策略缓存:

<hibernate-mapping>

  <class name="hibernatetest.Profile" table="Profiles" lazy="false">
    <cache usage="read-write" region="MainCache"/>
    <id column="id" name="id" unsaved-value="0">
      <generator class="native"/>
    </id>
    <discriminator column="type" type="string"/>
    <version name="version"/>
    <property name="name" type="string" length="100"/>
    <property name="available" type="yes_no"/>
  </class>
  
</hibernate-mapping>

根据缓存并发策略/缓存模式兼容性表,

然而,如果我换英菲尼斯潘。要使用的xml<代码>

这是无效缓存中的问题,还是我的配置中缺少了什么?

这是从无效缓存读取的实例的日志文件inv-read.txt和更新缓存的实例的日志文件inv-update.txt.

非常感谢。


共有1个答案

农星华
2023-03-14

问题是使用JCache-该表假设InfinispanRegionFactory而不是JCacheRegionFactory。

Infinispan似乎没有明确支持Hibernate 5.4的模块——不过,我想支持Hibernate 5.3的模块应该可以与Hibernate 5.4配合使用,因为Hibernate 5.4中的二级缓存区没有太多变化。

我很惊讶2LC与JCache一起使用复制/分布式缓存——我很确定它不能“可靠地”工作(事务性地,覆盖边缘情况等)无论如何。

 类似资料:
  • 我们有一个带有infinispan(v 9.4.18)失效缓存的双活动/活动节点Wildfly 19集群配置。 根据infinispan留档,当node1上的缓存值发生变化时,InvalidateCommand从节点1发送到node2,使node2缓存中的键条目无效/删除。 我注意到的是,即使在一个新的键put上,InvalidateCommand也会被发送。 在我们的应用程序中,如果在缓存中找不

  • 我正在玩弄一个基本的无限泛集群,我遇到了一个令人费解的错误。 我基本上实现了一个共享映射,只包含一个整数 这是我的服务代码 缓存是通过以下方式生成的: 当集群中至少有两台服务器时,computeIfAbsen会失败 这可以归结为: 最后是: 如果我把我非常好的时髦代码重写成丑陋的代码,它就会起作用。 我怎么能使用漂亮的电脑现在没有做事的方式? Eclipse 2018-12、WildFly 14、

  • 最近,我加强了我的keybeat部署,使用专用的Infinispan集群作为远程存储,为keybeat的各种缓存提供额外的持久性层。更改本身进行得相当顺利,尽管在进行此更改后,我们开始看到许多登录错误,这是由于

  • 我使用EhCache框架来缓存应用程序数据,并考虑使用JGroups缓存复制来复制集群环境中的缓存。 它真的是集群环境中缓存复制的行业标准吗?或者,我应该考虑其他更好的选择。请注意,此时我没有使用任何集中式缓存服务器。我已经在JGroups缓存复制上做了POC。你能就它的健壮性和主要关注点分享你的经验吗?使用JGroups进行缓存复制的利弊是什么?

  • 我有两个应用程序使用相同的数据库实体。这两个应用程序都部署在jboss eap 6.2独立的集群上。DB表仅从一个应用程序中更新,但从两个应用程序中读取。这两个应用程序都使用本机hibernate API从数据库读取/写入数据。 在嵌入式模式下将infinispan启用为2LC后,如何确保在一个应用程序中更新的缓存实体从第二个应用程序缓存中失效?是否有任何JMX/JMS接口用于信号缓存失效? 若我

  • hibernate中的一级缓存维护在会话对象上,并且在同一JVM的边界内。它是hibernate使用的强制缓存。我担心的是如何在集群环境中管理it。多个节点将拥有自己的一级缓存(等于会话数)。在单个JVM中,一个实体可以是不同会话的一部分,但事务管理器、乐观锁定可以处理这种情况。。。。但是,我们将如何在集群环境中管理it 1)一个实体可以在两个不同节点的一级缓存中被修改,导致数据过时、数据丢失等问