Spring Boot 如何将Infinispan Sping Boot Starter与Infinispan一起用作Hibernate的二级缓存提供程序?

ojsjcaue  于 7个月前  发布在  Spring
关注(0)|答案(1)|浏览(69)

我使用Infinispan Spring Boot Starter(infinispan-spring-boot 3-starter-embedded)和Spring Session分发会话。这工作得很好。
我的应用程序也使用Hibernate(不是JPA,而是使用Hibernate的SessionFactory)。为了获得分布式二级缓存,我设置了以下选项:

<property name="hibernate.cache.region.factory_class">infinispan</property>

字符串
这将region factory设置为org.infinispan.hibernate.cache.v60.InfinispanRegionFactory的实现。这将创建一个新的CacheManager -而不是重用我已经拥有的那个。这样做的问题似乎是它们的默认传输冲突,因为我的日志充满了这样的消息:
2023-10-30 13:58:09.311错误21424 [4,Rainbow-12965] o.j.l.Log4J2LogImpl:JGRP 000191:无法从/172.26.127.126接收数据包:51131:java.io.EOFException
2023-10-30 13:58:09.467错误21424 [4,Rainbow-12965] o.j.l.Log4J2LogImpl:JGRP 000191:无法从/172.26.127.126接收数据包:java.lang.IllegalArgumentException:无效的幻数258;需要在范围[0..100]内
此外,据我所知,Infinispan建议只使用一个CacheManager。那么有什么方法可以避免这种情况,如果可能的话,重用现有的CacheManager?

beq87vna

beq87vna1#

我最终使用了一个自定义区域工厂:

@Component("cacheRegionFactory")
public class CacheManagerReusingInfinispanCacheRegionFactory extends InfinispanRegionFactory {

    @Resource
    private EmbeddedCacheManager cacheManager;

    @Override
    protected EmbeddedCacheManager createCacheManager(Properties properties, ServiceRegistry serviceRegistry) {
        return cacheManager;
    }
}

字符串
org.springframework.orm.hibernate5.LocalSessionFactoryBean中设置属性cacheRegionFactory
这种方法的一个警告是,如果您使用spring-boot-actuator,您可能必须排除CacheMetricsAutoConfiguration.class,因为它似乎会拾取一些不生成统计信息的内部Hibernate缓存,从而导致NullPointerException。

相关问题