2013-05-16 52 views
1

正如標題所說,我有一個Web應用程序,它應該能夠在啓用了休眠二級緩存的羣集上運行,並且可以作爲事務管理器運行於org.springframework.orm.hibernate.HibernateTransactionManager。該應用程序只有一個數據庫。它將部署在Tomcat 7中,出於某種原因,公司不會使用任何應用程序服務器(我不負責)。現在我檢查了一些緩存提供程序,例如Infinispan,如文檔所述,當JTA用作事務管理器時,它是集羣安全的。Tomcat中的Spring + Hibernate(已啓用第二級緩存)(集羣),我需要JTA嗎?

我的工作是研究集羣安全的緩存解決方案。 現在我想知道是否有可能通過上述堆棧實現集羣安全緩存? JTA是必須的嗎?

回答

2

我在Tomcat和JBoss(儘管Tomcat的早期版本比您正在使用的版本)的集羣環境中使用org.hibernate.cache.EhCacheProviderorg.springframework.orm.hibernate3.HibernateTransactionManager成功。沒有必要使用JTA。

EHCache通過各種replication mechanisms支持開箱即用的羣集。我使用了RMI Replicated Caching機制,該機制使用多點傳送進行自動對等點發現,並且在每個節點具有多個高速緩存的多節點羣集中工作得非常好。

配置完成後,複製將發生在節點內的緩存之間以及跨節點的緩存之間。就應用程序而言,它非常可靠,透明,我不記得曾經處理過任何與之相關的問題。它只是工作。

您可以用屬性一起在Hibernate配置中指定EhCacheProvider,使二級高速緩存:

hibernate.cache.use_second_level_cache=true 
hibernate.cache.use_query_cache=true 
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider 

配置的其餘部分是在ehcache.xml文件定義了緩存和複製配置。如果您不熟悉ehcache.xml的格式,可能需要查看EHCache documentation - 但它們提供了一個有用的示例文件here

一個例子複製緩存從ehcache.xml可能是這個樣子:

<cache name="example" 
     maxElementsInMemory="1000" 
     eternal="false" 
     overflowToDisk="false" 
     timeToIdleSeconds="0" 
     timeToLiveSeconds="600"> 
     <cacheEventListenerFactory 
      class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/> 
     <bootstrapCacheLoaderFactory 
      class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory" 
      properties="bootstrapAsynchronously=true, maximumChunkSizeBytes=5000000"/> 
</cache> 

然後你需要添加這可能看起來像這樣的複製設置:

<cacheManagerPeerProviderFactory 
     class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
     properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.2, 
        multicastGroupPort=4455, timeToLive=1" /> 

<cacheManagerPeerListenerFactory 
     class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" 
     properties="hostName=localhost, port=40001, socketTimeoutMillis=2000" /> 

這的的確確是它。如文檔中所述,還有其他一些方法可以在EHCache中配置複製,但上述RMI方法相對簡單,並且對我來說運行良好。如果您決定使用EHCache,除了文檔之外,StackOverflow上還有various posts與複製有關,您可能需要諮詢。

+0

謝謝你的回答。 EHCache不是羣集安全嗎?看到這個http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-cache 這可能是舊的,但我不確定。 EHCache是​​否需要Terracota服務器來實現集羣安全? – braincell

+0

@braincell - 我認爲在EHCache 1.7中需要使用Terracotta來實施Hibernate鎖定 - 因爲該版本沒有實現Hibernate的鎖定和解鎖方法 - 所以它不被認爲是「集羣安全的」。我的理解是,從2.0版開始,EHCache是​​集羣安全的。請參閱[EHCache Hibernate用戶指南](http://ehcache.org/documentation/2.4/user-guide/hibernate),其中說**我們期望Ehcache 2。0在Hibernate文檔的新版本中被標記爲集羣安全** –

+0

是的,但是在他們說的那句話之前**在使用Terracotta的Ehcache 2.0中,鎖定和解鎖方法綁定到底層集羣高速緩存鎖。我們期望Ehcache 2.0在Hibernate文檔的新版本中被標記爲集羣安全。** 還想知道......( – braincell

相關問題