为什么Tomcat JDBC Pool Cleaner线程会抛出AbstractMethodError异常?
问题根因
- 你使用的 jTDS 1.3.1 版本仅支持 JDBC 3.0 规范,而 JDK 1.8 实现的 JDBC 4.1 规范在
java.sql.Connection接口中新增了isValid(int)抽象方法,该版本 jTDS 未实现对应方法,调用时直接抛出AbstractMethodError。 - Tomcat 8.5 自带的连接池默认优先调用 JDBC 4 原生的
isValid()方法做连接有效性校验,只有该方法不可用时才会 fallback 到你配置的validationQuery,因此即使配置了校验SQL也不会生效。
可行解决方案
方案1:强制禁用JDBC4原生校验(改动最小,无需更换驱动)
在你的useJdbc4Validation="false" 参数,强制连接池跳过 isValid() 调用,直接使用你配置的 validationQuery 做校验,修改后的配置参考如下:
<Resource name="jdbc/xxxx" auth="Container" driverClassName="net.sourceforge.jtds.jdbc.Driver" factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory" maxTotal="100" maxIdle="30" maxWaitMillis="10000" username="xxxxxx" password="xxxxx" testOnBorrow="true" testOnReturn="true" testWhileIdle="true" type="javax.sql.DataSource" url="jdbc:jtds:sqlserver:xxxxxxx;sendStringParametersAsUnicode=false" validationQuery="SELECT 1" useJdbc4Validation="false" />
方案2:升级jTDS驱动版本
将jTDS依赖升级到1.3.2及以上版本,该版本已实现isValid()方法,兼容JDBC4.1规范,升级后无需修改现有配置即可正常运行。
方案3:替换为微软官方SQL Server JDBC驱动
如果项目允许更换驱动,建议替换为微软官方的mssql-jdbc驱动,该驱动对高版本JDK和JDBC规范的兼容性更好,后续不会出现类似接口未实现的兼容性问题。
内容的提问来源于stack exchange,提问作者user16201131
相关产品推荐
相关产品推荐

