Spring Boot + Hazelcast + Hibernate 5 L2 Cache

mas*_*pen 0 hibernate hazelcast spring-boot

我有一个hibernate(5.0.11.Final)Spring Boot(1.4.1-RELEASE)应用程序,它使用Hazelcast(3.7.1)作为L2缓存实现.

我想澄清一下,使用hibernate l2配置,我不需要包含我自己的hazelcast.xml文件.

我问,因为当我启动这个应用程序的实例时,当我同时拥有(hibernate l2配置和src/main/resource/hibernate.xml文件)时,我看到创建了2个成员.当我开始另一个实例时,我看到4.我的印象是每个应用程序实例只能看到1个成员.

我正在关注用户遇到类似问题的相关主题.我首先尝试在hibernate配置(以编程方式)命名我的hazelcast实例,但这没有任何区别.

当我从类路径中删除hazelcast.xml并启动一个实例时,我只看到一个成员; 我想要的是.从第2名开始,开始第2名成员; 我想要的是.

这是使用hazelcast实现hibernate l2缓存的正确方法(仅通过hibernate配置)吗?

如果是这样,当我想使用hazelcast.xml文件提供的细粒度hazelcast配置时会发生什么?

小智 10

如果Spring Boot 1.4.1找到一个hazelcast.xml文件而没有找到Configbean,它将从中创建一个Hazelcast实例.

Hazelcast Hibernate模块使用该hibernate.cache.hazelcast.instance_name属性来确定您是否需要新的Hazelcast实例或现有实例.

如果省略,hibernate.cache.hazelcast.instance_name则会获得一个新的Hazelcast实例(也基于hazelcast.xml此实例),这就是为什么在一个JVM中有两个实例的原因.

有很多方法可以解决.您可以阻止Spring Boot自动创建实例,并且可以阻止Hazelcast Hibernate自动创建实例.

如果您使用的是Spring Boot,我的建议是使用一个也是Spring bean的Hazelcast实例.这样bean将由Spring生命周期管理,你可以获得优雅的关机控制.

Spring Boot为您创建的实例是最简单,最明显的方法.要让Hazelcast Hibernate模块也使用它,只需在创建JPA属性时传递实例名称,例如: properties.setProperty("hibernate.cache.hazelcast.instance_name", hazelcastInstance.getName());