Tomcat 9.0与JDBC报错:org.apache.tomcat.jdbc.pool.PooledConnection非接口
核心错误点:java.lang.IllegalArgumentException: org.apache.tomcat.jdbc.pool.PooledConnection is not an interface
该错误表明代码尝试将org.apache.tomcat.jdbc.pool.PooledConnection(具体类)当作接口生成动态代理,导致失败。回退代码快照无效,说明问题不在业务代码,而是运行环境、依赖冲突或类加载逻辑异常,以下是具体排查方向:
排查依赖冲突
用构建工具的依赖分析命令(Gradle:./gradlew dependencies;Maven:mvn dependency:tree)检查tomcat-jdbc相关依赖,确认是否存在多版本共存。若有冲突,排除冗余版本,统一使用与项目Spring、Tomcat版本匹配的稳定版。检查类加载器冲突
若为Tomcat部署,确认服务器lib目录与项目自身依赖中是否同时存在tomcat-jdbc包。类加载器会优先加载服务器目录下的类,导致与项目依赖版本不一致。可将项目中tomcat-jdbc依赖设为provided,或清理服务器lib中的对应包,统一由项目依赖管理。验证JDK版本兼容性
近期若更换过JDK版本,需确认Tomcat JDBC池版本是否支持当前JDK(比如旧版tomcat-jdbc对JDK11+的兼容性问题)。升级tomcat-jdbc到适配当前JDK的版本,或回退到之前稳定的JDK版本测试。调整代理配置
检查项目中JDBC连接相关的代理配置(比如Spring事务代理、自定义连接拦截器),若配置中错误将PooledConnection作为代理接口,需修改为代理java.sql.Connection标准接口;若使用Spring代理,可开启CGLIB代理(设置proxy-target-class=true),支持对具体类的代理。排查环境变更
检查近期是否修改过服务器配置、Tomcat版本、构建工具仓库地址等。回退服务器配置到之前的稳定状态,清理本地依赖仓库缓存后重新构建项目,排除环境变更导致的异常。
内容的提问来源于stack exchange,提问作者Ted Poovey

