我已经在 Tomcat 和 JBoss 的集群环境中成功使用org.hibernate.cache.EhCacheProvider
with org.springframework.orm.hibernate3.HibernateTransactionManager
(尽管 Tomcat 的版本比您使用的版本更早)。没有必要使用 JTA。
EHCache 通过各种复制机制支持开箱即用的集群。我使用了RMI 复制缓存机制,该机制使用多播进行自动对等发现,并且在每个节点有多个缓存的多节点集群中工作得非常好。
配置完成后,复制将在节点内的缓存之间以及跨节点的缓存之间进行。就应用程序而言,它非常可靠、透明,我不记得曾经处理过任何与之相关的问题。它刚刚奏效。
您可以在 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 文档,但它们在此处ehcache.xml
提供了一个有用的示例文件。
复制缓存的示例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 上与复制相关的各种帖子。