2016-01-13 102 views
2

我有一個配置了Hibernate(hibernate core 4.2.8)的spring項目(spring core 3.1.2),我想將Hazelcast設置爲二級緩存。我希望以P2P,嵌入式集羣模式分發緩存(每個應用程序實例在同一臺計算機上運行一個hazelcast實例)。Spring + Hibernate with Hazelcast作爲二級緩存

這是我當前的sessionFactory配置。

 <bean id="sessionFactory" 
      class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" scope="singleton"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan" value="com.myProject.beans" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.database">ORACLE</prop> 
       <prop key="hibernate.show_sql">false</prop> 
       <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
       <!--enable batch operations--> 
       <prop key="hibernate.jdbc.batch_size">20</prop> 
       <prop key="hibernate.order_inserts">true</prop> 
       <prop key="hibernate.order_updates">true</prop> 
       <!-- 2nd level cache configuration--> 
       <prop key="hibernate.cache.use_second_level_cache">true</prop> 
       <prop key="hibernate.cache.region.factory_class">com.hazelcast.hibernate.HazelcastLocalCacheRegionFactory</prop> 
       <prop key="hibernate.cache.use_query_cache">false</prop> 
      </props> 
     </property> 
    </bean> 

這個配置似乎在我的本地機器上工作,因爲我運行了一個小測試,檢查第二級緩存命中。

現在的問題是: 爲了讓緩存分佈在實例中,我必須做些什麼其他配置?不同的機器如何「彼此瞭解」? 另外,有沒有辦法創建一個測試場景來檢查緩存確實分佈在幾臺機器之間?(例如:launch 2 jvms)一個例子將不勝感激。

歡迎任何關於此配置的其他提示或警告。

免責聲明:這是我第一次使用Hazelcast。

我的Hazelcast版本是3.5.4

謝謝!

回答

2

你不需要做任何配置來形成一個集羣。 只需啓動應用程序的另一個實例,兩個hazelcast實例應該互相看到並形成一個羣集。 默認情況下,hazelcast會員使用組播來找到對方,當然你可以通過在你的項目中添加一個自定義的hazelcast.xml來改變這種行爲。

下面是一個Spring-Hibernate-Hazelcast集成的詳細例子。

https://github.com/hazelcast/hazelcast-code-samples/tree/master/hazelcast-integration/spring-hibernate-2ndlevel-cache

applicationContext-hazelcast.xml是,如果你想與Hazelcast配置發揮到修改文件。 例如,在此示例項目port-auto-increment設置爲false 這意味着如果指定端口已被佔用,Hazelcast將不會啓動。 (默認爲5701)

只需將此屬性設置爲true並啓動另一個Application實例,就會看到緩存是分佈式的。

請不要忘記開始一審,以保持工藝活

開始一審像下面前註釋掉Application類的最後一行;

public static void main(String[] args) { 
    InitializeDB.start(); 

    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    DistributedMapDemonstrator distributedMapDemonstrator = context.getBean(DistributedMapDemonstrator.class); 
    distributedMapDemonstrator.demonstrate(); 

    //Hazelcast.shutdownAll(); Keep instances alive to see form a cluster 
} 

第二個像下面這樣;

public static void main(String[] args) { 
    //InitializeDB.start(); DB will be initialized already by the first instance 

    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    DistributedMapDemonstrator distributedMapDemonstrator = context.getBean(DistributedMapDemonstrator.class); 
    distributedMapDemonstrator.demonstrate(); 

    //Hazelcast.shutdownAll(); Keep instances alive to see form a cluster 

}