2016-10-30 74 views
0

我有一個使用Hazelcast(3.7.1)作爲L2緩存實現的hibernate(5.0.11.Final)Spring Boot(1.4.1-RELEASE)應用程序。Spring Boot + Hazelcast + Hibernate 5 L2 Cache

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

我問,因爲當我啓動這個應用程序的一個實例時,我有兩個(hibernate l2配置和一個src/main/resource/hibernate.xml文件),我看到2個成員創建。當我開始另一個實例時,我看到4.我的印象是,我應該只看到每個應用程序實例有1個成員。

我跟着related thread用戶遇到類似的東西。我首先嚐試在每個線程的hibernate配置中命名我的hazelcast實例(以編程方式),但這沒有什麼區別。

當我從類路徑中刪除我的hazelcast.xml &啓動一個實例時,我只看到1個成員;我想要的是。開始第二名,開始第二名成員;我想要的是。

這是使用hazelcast(僅通過休眠配置)實現hibernate l2緩存的正確方法嗎?

如果是這樣,當我想使用通過hazelcast.xml文件提供的細粒度hazelcast配置時會發生什麼?

回答

10

如果Spring Boot 1.4.1發現hazelcast.xml文件並且沒有Config bean,它將從中創建一個Hazelcast實例。

Hazelcast休眠模塊使用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

出色答卷!也許你可以添加一個參考[​​這個問題](https://github.com/spring-projects/spring-boot/issues/4158),提供更多的信息?也許Spring Boot可以讓你配置名字,這樣你就不必自己做最後一點了(我的意思是'properties.setProperty')。 –

+0

感謝您的及時回覆。我遵循你的建議,並使用Spring Bean的「上下文」重新設置了hibernate.xml配置文件: – maspen

0

謝謝@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()); 
...