从JBoss迁移至TomEE:GWT应用中Hibernate二级缓存适配问题
迁移GWT应用从JBoss到TomEE:Hibernate二级缓存方案选择
首先直接给结论:不推荐在TomEE环境中继续使用JBoss Cache,更建议切换到Hibernate官方支持、且与TomEE兼容的缓存实现,比如EHCache或者Hazelcast。下面详细说原因和配置方案:
为什么不推荐JBoss Cache?
JBoss Cache是JBoss Application Server专属的缓存组件,它和JBoss容器的生命周期、类加载机制深度绑定。TomEE作为Apache主导的Java EE容器,既没有内置对JBoss Cache的支持,也没有针对它做兼容性适配。如果强行手动集成,你大概率会遇到:
- 类加载冲突(比如JBoss Cache依赖的JBoss内部类在TomEE中不存在)
- 缓存生命周期与TomEE容器不兼容(比如缓存无法随容器启动/关闭)
- 缺乏官方维护和支持,后续遇到问题很难排查
推荐的替代缓存方案及配置
方案1:EHCache(轻量、单机场景首选)
EHCache是Hibernate官方推荐的缓存实现,轻量且易于配置,完全兼容TomEE。
修改后的hibernate.cfg.xml配置片段:
<hibernate-configuration> <session-factory> <!-- 原有数据库连接配置保留 --> <property name="hibernate.connection.driver_class">com.sybase.jdbc3.jdbc.SybDriver</property> <!-- 其他数据库连接属性... --> <!-- 二级缓存核心配置 --> <property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.use_query_cache">true</property> <!-- 如果需要查询缓存的话 --> <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property> <!-- 指定EHCache配置文件路径(可选,默认会找classpath下的ehcache.xml) --> <property name="hibernate.cache.provider_configuration_file_resource_path">/ehcache-hibernate.xml</property> <!-- 实体类缓存配置,比如: --> <class-cache class="com.yourpackage.YourEntity" usage="read-write"/> </session-factory> </hibernate-configuration>
同时需要在项目依赖中添加EHCache和Hibernate-EHCache的jar包(如果用Maven的话):
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>和你的Hibernate版本匹配</version> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>合适的稳定版本</version> </dependency>
方案2:Hazelcast(分布式集群场景首选)
如果你的应用是集群部署,Hazelcast是更好的选择,它提供分布式缓存能力,且和TomEE集成友好。
hibernate.cfg.xml核心配置:
<hibernate-configuration> <session-factory> <!-- 原有数据库配置 --> <property name="hibernate.connection.driver_class">com.sybase.jdbc3.jdbc.SybDriver</property> <!-- 其他属性... --> <property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.use_query_cache">true</property> <property name="hibernate.cache.region.factory_class">com.hazelcast.hibernate.HazelcastCacheRegionFactory</property> <!-- 指定Hazelcast配置文件 --> <property name="hibernate.cache.hazelcast.configuration_file_path">/hazelcast.xml</property> </session-factory> </hibernate-configuration>
(不推荐)强行使用JBoss Cache的尝试方案
如果你坚持要尝试在TomEE中使用JBoss Cache,需要做以下步骤,但风险极高:
- 将JBoss Cache的所有依赖jar包(包括JBoss内部的相关类)打包到你的应用中,或者放到TomEE的
lib目录下 - 在
hibernate.cfg.xml中配置JBoss Cache的区域工厂:
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.jbc.JBossCacheRegionFactory</property> <property name="hibernate.cache.jbc.cfg">/jboss-cache.xml</property>
但请注意:这种方式会带来大量的兼容性问题,比如类冲突、容器启动失败等,后续维护成本极高,不建议采用。
内容的提问来源于stack exchange,提问作者abc123
相关产品推荐
相关产品推荐

