Spring Boot + Hazelcast + Hibernate 5 L2 Cache

时间:2016-10-30 01:23:24

标签: hibernate spring-boot hazelcast

我有一个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配置时会发生什么?

2 个答案:

答案 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());
...
相关问题