Hibernate从3.x升级至4.0.0的缓存适配与日志报错问题
Hibernate 3.x 升级至4.0.0 两类问题的落地解决方法
基于jSpaces-1.0.jar的Gigaspaces二级缓存适配
- 适配核心逻辑:Hibernate 4 已彻底移除Hibernate3时代的
org.hibernate.cache.CacheProvider接口,替换为完整的org.hibernate.cache.spi.RegionFactorySPI体系。原生jSpaces-1.0.jar仅实现了适配旧接口的缓存客户端,无法被Hibernate4直接识别,且原有代码依赖的大量缓存类已从Hibernate核心包中移除,需做一层薄桥接适配,全程不需要改动jSpaces-1.0.jar本身的Gigaspaces连接逻辑:- 编写自定义
RegionFactory实现类,将jSpaces-1.0暴露的核心缓存读写操作,映射到Hibernate4要求的实体缓存区域、集合缓存区域、查询缓存区域的接口方法上 - 替换原有缓存配置项:将Hibernate3中配置的
hibernate.cache.provider_class参数,替换为hibernate.cache.region.factory_class,值指向上述自定义桥接实现类,同时保留原jSpaces配置的Gigaspaces连接地址、序列化规则等参数 - 对齐锁策略:根据jSpaces-1.0的缓存操作特性,指定
hibernate.cache.access_type为适配类型——无严格写锁需求的场景选择NONSTRICT_READ_WRITE,纯读场景选择READ_ONLY,避免接口签名不匹配导致的类转换异常
- 编写自定义
java.lang.NoSuchFieldError: Trace 报错排查(已排除lib目录低版本log4j场景)
- 报错本质:该报错触发位置在
org.jboss.logging.Log4jLogger.translate方法,属于类加载阶段的字段不匹配,并非仅由项目lib目录的log4j版本决定,排查路径需覆盖所有类加载来源:- 全局扫描所有类加载路径的log4j类:除项目自带lib目录外,需检查应用服务器公共lib目录、打包在依赖包内的传递引入log4j版本。不少老框架的传递依赖会默认引入1.2.12之前的log4j,这类版本的
Level类不存在TRACE静态字段;即便项目lib目录放置了高版本log4j,被类加载优先加载的旧版类依然会触发报错 - 版本匹配修正:如果全路径log4j版本均>=1.2.12,可直接将Hibernate4.0.0依赖的
jboss-logging从自带的3.1.0.CR2升级到3.1.3.Final,该版本修复了Log4jLogger类硬编码访问log4jTrace字段的已知bug - 快速验证方案:临时在log4j配置中开启TRACE级别输出,若配置生效则说明log4j本身支持TRACE能力,若仍报错即可确认是jboss-logging与log4j的版本绑定错位
- 全局扫描所有类加载路径的log4j类:除项目自带lib目录外,需检查应用服务器公共lib目录、打包在依赖包内的传递引入log4j版本。不少老框架的传递依赖会默认引入1.2.12之前的log4j,这类版本的
内容的提问来源于stack exchange,提问作者Sneha Singh
相关产品推荐
相关产品推荐

