1

正如标题所说,我有一个 Web 应用程序,它应该能够在启用了休眠二级缓存并org.springframework.orm.hibernate.HibernateTransactionManager作为事务管理器的集群上运行。该应用程序只有一个数据库。它将部署在Tomcat 7中,出于某种原因公司不会使用任何应用程序服务器(我不负责)。现在我检查了一些缓存提供程序,例如 Infinispan,正如文档所说,当 JTA 用作事务管理器时,它是集群安全的。

我的工作是研究一种集群安全的缓存解决方案。现在我想知道是否可以使用上述堆栈实现集群安全缓存?JTA是必须的吗?

4

1 回答 1

2

我已经在 Tomcat 和 JBoss 的集群环境中成功使用org.hibernate.cache.EhCacheProviderwith 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 上与复制相关的各种帖子。

于 2013-05-16T12:44:55.913 回答