我有一个使用EhCache进行数据缓存的Spring Web应用程序。
Ehcache拥有很少的Java.Util.Map,用于整个应用程序视图页面。当用户从前端屏幕创建记录(比如一些商业JAVA POJO对象)时,该记录将被插入到数据库中,随后,EhCache保存的地图将被更新。
后来,我们将这个Web应用程序部署在多个,即3个tomcat实例中。可以通过Apache HTTP Load Balancer访问应用程序。
我们面临的问题是,当用户将记录插入数据库时,EhCache仅在获取请求的tomcat实例上运行的应用程序中更新。由于我们有3个tomcat实例,因此在其他2个tomcat实例上运行的应用程序没有更新的EhCache数据。这会影响用户立即从屏幕上查看更新的数据。
有人可以建议如何解决此问题。如何在多个tomcat实例上运行的Spring Web应用程序之间同步EhCache数据。
> FYKI,这是我职业生涯中的第一个Web应用程序,也是数据缓存概念的开端。请告诉我解决这个问题的方法吗?
让我分享一下我在Spring网络应用程序中配置EhCache的简单方法,
以下是在spring-servlet.xml中配置的
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcache" />
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
p:config-location="classpath:ehcache.xml" p:shared="true"/>
来自Java业务类
public class PortfolioUserDetailsServiceImpl implements PortfolioUserDetailsService {
private Logger logger = LoggerFactory
.getLogger(PortfolioUserDetailsServiceImpl.class);
private UserDao userDao;
@Autowired
private CacheManager cacheManager;
private Ehcache userRoleCache;
@PostConstruct
public void init() {
// Load our widgets cache:
userRoleCache = cacheManager.getEhcache("userRoleCache");
// Create an EHCache Element to hold the widget
Element element = new Element("getAllRoles", userDao.getAllRoles());
// Add the element to the cache
userRoleCache.put(element);
}
@PreDestroy
public void destory() {
logger.info("INVENTORYSERVICEIMPL destroy method called");
}
这是我的ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache name="PortfolioCache" updateCheck="false">
<defaultCache maxElementsInMemory="10000" eternal="false"
timeToIdleSeconds="0" timeToLiveSeconds="0" overflowToDisk="true"
diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU" />
<cache name="userRoleCache" maxElementsInMemory="100" eternal="false"
timeToIdleSeconds="0" timeToLiveSeconds="0" memoryStoreEvictionPolicy="LFU">
</cache>
<diskStore path="java.io.tmpdir" />
</ehcache>
答案 0 :(得分:0)
我认为最佳方法是使用“Terracotta Distributed Ehcache” 您可以参考以下链接:
http://terracotta.org/documentation/enterprise-ehcache/get-started http://ehcache.org/documentation/2.6/get-started/about-distributed-cache
答案 1 :(得分:0)
拥有多个应用程序服务器时的主要问题是缓存一致性。
在tomcat 1中更新缓存条目时,需要将更新传播到其他服务器。
在这种情况下,您确实可以选择clustered Ehcache。我不建议使用复制缓存,因为它仍然会暴露出一个不一致的窗口。当然,其他缓存提供商也提供集群选项。