升级c3p0后出现serialVersionUID不匹配及jtds兼容问题求助
依赖兼容问题解决步骤
问题根源说明
- 最初的
serialVersionUID不匹配问题本质是:RefFSContextFactory存储的JNDI绑定文件是Java序列化对象的持久化文件,你用打包了旧版c3p0 0.9.1.2的fsjndibinder.jar生成绑定文件时,序列化的WrapperConnectionPoolDataSource类携带的是旧版本的serialVersionUID,和项目中新版本c3p0的同类别UID不一致,导致反序列化失败。 - 升级c3p0后出现的
AbstractMethodError是因为jtds 1.2.2仅支持JDBC3.0规范,而Hibernate4、新版c3p0调用的是JDBC4.0及以上规范新增的setBinaryStream(int parameterIndex, InputStream x, long length)方法,JDBC3.0版本的该方法第三个参数为int类型,类型不匹配就会触发抽象方法错误。 - 升级jtds到1.3.1后出现的连接关闭警告,是依赖版本不完全兼容+连接池配置不适配共同导致的。
具体解决步骤
- 首先统一经过验证的兼容版本基线:
- 保留当前Spring 4.1.6、Hibernate 4.3.0版本不变
- 将c3p0版本从0.9.2.1升级到0.9.5.5:该版本是c3p0稳定版,完全兼容JDBC4.0+规范,且和你当前使用的Spring、Hibernate版本没有适配问题
- 保留jtds 1.3.1版本不变:该版本是支持JDBC4.0的最新稳定jtds版本,适配SQL Server、Sybase等数据库的常规场景
- 清理全链路冲突依赖:
- 排查项目
WEB-INF/lib目录下所有jar包,确保仅存在一个版本的c3p0、jtds、fscontext相关jar包,删除所有旧版本残留文件 - 重新生成JNDI绑定文件:把fsjndibinder.jar内打包的旧依赖全部替换成当前项目使用的c3p0 0.9.5.5、jtds 1.3.1版本,再重新生成绑定文件,替换所有应用读取路径下的旧绑定文件
- 排查项目
- 调整c3p0连接池配置,解决连接关闭警告:
在数据源配置中新增以下参数,规避连接提前关闭问题:<property name="maxIdleTime" value="1800"/> <property name="testConnectionOnCheckout" value="true"/> <property name="preferredTestQuery" value="SELECT 1"/> <property name="breakAfterAcquireFailure" value="false"/> <property name="closeConnectionOnCheckin" value="false"/> - 最后清理应用服务器的work目录、临时缓存后重启应用,验证全量数据库操作流程是否正常。
内容的提问来源于stack exchange,提问作者arunken
相关产品推荐
相关产品推荐

