【问题标题】:Spring Boot + Hazelcast + Hibernate 5 L2 CacheSpring Boot + Hazelcast + Hibernate 5 L2 缓存
【发布时间】:2016-10-30 01:23:24
【问题描述】:

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

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

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

我正在关注related thread,用户在其中遇到了类似的情况。我首先尝试在每个线程的休眠配置中(以编程方式)命名我的 hazelcast 实例,但这没有任何区别。

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

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

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

【问题讨论】:

    标签: hibernate spring-boot hazelcast


    【解决方案1】:

    如果 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());

    【讨论】:

    • 优秀的答案!也许您可以添加参考to this issue 以提供更多信息?也许 Spring Boot 可以让您配置名称,这样您就不必自己做最后一点(我的意思是properties.setProperty)。
    • 感谢您的及时回复。我听从了您的建议并使用 Spring Bean 'context' 重新设置了 hibernate.xml 配置文件:
    【解决方案2】:

    谢谢@NeilStevenson。希望一个示例对其他人有所帮助,包括我根据 Neil 的建议所做的(有效的):

    创建 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>
    

    在“配置”中注入 hazelcast 实例:

    import com.hazelcast.core.HazelcastInstance;
    ...
    
    @Inject
    public HazelcastInstance hazelcastInstance;
    

    然后在hibernate配置中引用:

    ...
    hibernateJpaProperties.setProperty("hibernate.cache.hazelcast.instance_name", hazelcastInstance.getName());
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2018-09-30
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 2016-04-18
      相关资源
      最近更新 更多