我有一个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个成员。
我正在关注用户遇到类似内容的related thread。我首先尝试在hibernate配置(以编程方式)命名我的hazelcast实例,但这并没有区别。
当我从classpath&中删除hazelcast.xml时启动一个实例,我只看到1个成员;我想要的是。从第2名开始,开始第2名成员;我想要的是什么。
这是使用hazelcast实现hibernate l2缓存的正确方法吗(仅通过hibernate配置)?
如果是这样,当我想使用hazelcast.xml文件提供的细粒度hazelcast配置时会发生什么?
答案 0 :(得分:10)
如果Spring Boot 1.4.1找到hazelcast.xml
文件且没有Config
bean,它将从中创建一个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());
答案 1 :(得分:0)
谢谢@NeilStevenson。希望一个例子对其他人有所帮助,包括我根据尼尔的建议做了什么(有效):
创建包含以下内容的src / main / resources / hazelcast.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:spring="http://www.hazelcast.com/schema/spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.hazelcast.com/schema/spring https://hazelcast.com/schema/spring/hazelcast-spring-3.7.xsd">
<spring:hazelcast id="hibernateHazelcastInstance">
<spring:config>
<spring:instance-name>springHibernate</spring:instance-name>
<spring:group password="foo" name="bar"/>
<spring:network port="5701" port-auto-increment="false">
<spring:tcp-ip enabled="false">
<spring:members>127.0.0.1</spring:members>
</spring:tcp-ip>
</spring:join>
</spring:network>
</spring:config>
</spring:hazelcast>
<spring:hibernate-region-factory id="regionFactory" instance-ref="hibernateHazelcastInstance"/>
</beans>
在'config'中注入hazelcast实例:
import com.hazelcast.core.HazelcastInstance;
...
@Inject
public HazelcastInstance hazelcastInstance;
然后在hibernate配置中引用它:
...
hibernateJpaProperties.setProperty("hibernate.cache.hazelcast.instance_name", hazelcastInstance.getName());
...