`

Tomcat中部署多个war服务Ehcache故障

 
阅读更多

一、场景说明

场景1:同一份war被copy多份部署到同一Tomcat中运行,此时cacheManager的名称是相同的(多版本部署修改war名称:ROOT.war、v1.war、v2.war)

场景2:多个不同的war被部署到同一Tomcat中运行,多个war中cacheManager命名出现相同

说  明:

1)药师360药品说明书项目遇到的为场景1,多版本部署在同一Tomcat中

2)此处为了解决Tomcat中多个war服务Ehcache故障问题,对于RMI缓存集群共享不在此文档范围

 

二、解决过程

Tomcat服务启动时会出现异常(只有一个war服务正常):

Invocation of init method failed; nested exception is net.sf.ehcache.CacheException: Another CacheManager with same name 'drug-instruction' already exists in the same VM. 
Please provide unique names for each CacheManager in the config or do one of following:
1. Use one of the CacheManager.create() static factory methods to reuse same CacheManager with same name or create one if necessary
2. Shutdown the earlier cacheManager before creating new one with same name.

原因:Ehcache是进程内缓存,进程内缓存共享,此时将ehcache.xml中缓存配置加上:『p:shared="true" 』,如下:

<bean id="appCacheManageBean" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
p:configLocation="classpath:spring/drug-instruction-ehcache.xml" p:shared="true" />

 

修改后重新部署、启动Tomcat此时能够正常启动,但当请求的服务使用到缓存的地方又出现故障(第一个A服务正常,其他B出现故障),如下:

java.lang.ClassCastException: com.oncloudit.drug.instruction.dto.Hospital cannot be cast to com.oncloudit.drug.instruction.dto.Hospital

分析:首先访问A服务此时将对象缓存至Ehcache缓存中,B服务请求缓存是可以拿个改对象(只是此对象属于A),但转换失败;

估计是Tomcat不同的war服务context不一样、其对应的内存区域不一样,但Ehcache是进程内缓存共享,所以可以取到值,但类型转换失败。

 

解决方式一:将缓存对象序列化、反序列化就可以使用了,或:Hospital hospital = JsonUtil.json2Object(JsonUtil.object2Json(hospital), new TypeReference<Hospital>() {});

解决方式二:A、B两个war中因cacheManager名称相同,此时可以动态创建名称不同的cache或动态生成cache-key,此处采用动态生成cache-key举例:

步骤1)A、B两个程序中定义全局变量

public static final String APP_UNIQUE_IDENTIFIER = UUID.randomUUID().toString();

步骤2)不同项目cache-key前缀不同

public static final String CACHE_KEY_HOSPITAL = ConfigConstant.APP_UNIQUE_IDENTIFIER + "_hospital";

缓存key使用此种方式,这样不同的war服务中cacheManager名称可以相同,不同war项目可以正常工作

解决方式三:不使用Ehcache(改用memcache、redis ...)或war部署至不同的Tomcat服务中

分享到:
评论

相关推荐

    黑马程序员-tomcat集群部署文档资料

    集群的主要目标是提高系统的可用性和可扩展性,通过负载均衡分散请求到多台服务器,避免单一节点故障导致的服务中断。在集群中,各个节点之间可以共享数据和服务,共同处理任务,提升整体性能。 【集群环境介绍】 ...

    jboss集成 ehcache 快捷部署缓存

    总的来说,这个压缩包提供了一种便捷的方式,帮助开发者快速在jboss环境中部署和使用ehcache,从而实现高效的数据缓存和共享。通过深入理解ehcache和jboss的集成机制,可以进一步优化系统的性能和响应速度。

    Tomcat部署及优化

    总结,Tomcat部署及优化是一个涉及多方面的工作,包括JDK的配置、Tomcat的启动与部署、JVM参数调整、服务器配置优化以及应用本身的性能提升。每个环节都需要细致考虑,以确保Tomcat能够高效、稳定地运行Web应用程序...

    Tomcat常见文件以及部署等

    部署动态网站在Tomcat中涉及到几个步骤:首先,你需要将你的Java Web项目打包成一个WAR(Web ARchive)文件,然后将这个WAR文件放入Tomcat的`webapps`目录下。Tomcat会自动解压并部署该文件。如果项目是已编译好的...

    ehcache使用,以及集群配置

    4. **故障转移**: 如果一个服务器宕机,Ehcache可以自动切换到另一个可用的服务器,保持服务的连续性。 5. **监控与管理**: Terracotta Server 提供了管理控制台,可以实时监控缓存状态,查看统计信息,以及进行...

    Ehcache 3(ehcache-clustered-3.8.1-kit.zip)

    在"ehcache-clustered-3.8.1-kit.zip"这个压缩包中,我们重点关注的是Ehcache的集群支持版本,这使得多个节点能够协同工作,共享和同步缓存数据,从而提高系统的可扩展性和可用性。 Ehcache 3 的核心概念包括缓存...

    ssm多模块基础框架+dubbo+ehcache

    【标题】"ssm多模块基础框架+dubbo+ehcache" 涉及到的核心技术栈包括Spring、SpringMVC、MyBatis(SSM)框架的整合,Dubbo服务治理框架,以及Ehcache缓存系统。这些技术在企业级Java应用开发中扮演着重要角色,下面...

    ehcache配置使用详解

    8. **多实例支持**:允许在同一应用中存在多个缓存管理器实例,每个实例可以管理多个缓存区域,灵活性高。 #### 二、ehcache环境与资源 为了充分利用ehcache的功能,开发者需准备以下环境: - **操作系统**:...

    ehcache三个小demo

    在“ehcache三个小demo”中,我们有三个示例项目,分别展示了Ehcache的不同应用场景和配置方式。 1. **SpringMybatis**: 这个项目的名称暗示了它结合了Spring框架和MyBatis持久层框架。Ehcache在此可能作为数据层...

    Ehcache经典中文教程

    Ehcache 是一款广泛使用的 Java 缓存框架,它的核心功能是提高应用程序的性能和响应速度,通过将频繁访问的数据存储在内存中,避免了反复从数据库或其他慢速存储介质中读取数据。本教程将深入讲解 Ehcache 的基本...

    ehcache2.6.5.rar

    Ehcache是一个开源的Java缓存库,广泛用于提高应用程序的性能和响应速度,通过存储经常访问的数据在内存中,避免了频繁的数据库查询。它最初由Tomi Triebel开发,现在是Terracotta公司的产品。在版本2.6.5中,...

    Ehcache通过Jgroups做集群

    在Ehcache中,Jgroups被用来实现节点间的通信和同步,确保在集群中的多个Ehcache实例能够保持数据一致性。 在Ehcache通过Jgroups进行集群配置时,首先需要理解Jgroups的配置文件——`jgroups.xml`。这个文件定义了...

    ehcache-3.3.1-API文档-中文版.zip

    赠送jar包:ehcache-3.3.1.jar; 赠送原API文档:ehcache-3.3.1-javadoc.jar; 赠送源代码:ehcache-3.3.1-sources.jar; 赠送Maven依赖信息文件:ehcache-3.3.1.pom; 包含翻译后的API文档:ehcache-3.3.1-javadoc-...

    Ehcache分布式缓存与其在SpringBoot应用

    JGROUP是一个用于构建可靠集群通信的库,可以提供组成员资格、故障检测、传输协议等多种功能,使得Ehcache能够在多个节点之间共享和同步缓存数据。Ehcache的分布式特性允许在大型系统中进行负载均衡,提高应用性能,...

    ehcache1.6 和 ehcache-web-2.0.4

    Ehcache是一个流行的Java缓存库,用于提高应用程序性能,减少对数据库的访问频率。它在内存中存储数据,提供快速的数据检索,并可选地将数据持久化到磁盘,以便在应用程序重启后仍能使用。Ehcache 1.6是其早期版本,...

    ehcache

    在 Hibernate 中,Ehcache 可以作为二级缓存提供服务,将查询结果存储在缓存中,避免重复查询数据库。只需在 Hibernate 配置文件中指定 Ehcache 作为二级缓存提供者即可。 ## 5. Ehcache 的分布式缓存 Ehcache ...

    mybatis ehcache 整合中文文档

    - **缓存同步**:在分布式环境中,可以使用EHCache的分布式缓存功能来保持多个节点之间的缓存一致性。 #### 五、常见问题及解决方案 **1. 如何解决缓存与数据库数据不一致的问题?** - 实现缓存与数据库同步更新...

    Ehcache 简单的监控

    Ehcache是一个开源的、高性能的缓存解决方案,广泛应用于Java应用程序中,以提高数据访问的速度和效率。本文将深入探讨Ehcache的简单监控,帮助开发者更好地理解其工作原理和性能状态。 首先,了解Ehcache的核心...

    Ehcache集群实例

    1. **Ehcache集群**:Ehcache集群使得多台服务器上的多个Ehcache实例能够共享数据。这通过分布式缓存实现,其中的缓存项可以在集群中的任何节点上创建和查找。当一个节点更新缓存时,其他节点会自动同步,确保一致性...

Global site tag (gtag.js) - Google Analytics