JDBC驱动升级问题根源在于版本错配、类加载冲突或协议不兼容;需核对运行时JVM版本、数据库真实版本、URL参数、classpath唯一性及驱动类名是否匹配官方要求。

Java 中 JDBC 驱动版本升级后出问题,往往不是“功能坏了”,而是版本错配、类加载冲突或协议不兼容在悄悄作怪。排查关键不在堆栈日志第一行,而在运行时环境与驱动契约的匹配关系。
看运行时 JVM 版本,不是编译 JDK 版本
驱动能否加载,只取决于 java -version 输出的实际运行环境。比如:
-
ojdbc8.jar可以在 JDK 8/11/17/21 下稳定运行(Oracle 官方验证至 JDK 21) -
ojdbc10.jar最低要求运行时 JDK 10,放 JDK 8 里会直接抛UnsupportedClassVersionError -
mysql-connector-java 8.0.28要求 JDBC URL 加上时区参数(如?serverTimezone=Asia/Shanghai),否则连得上但查不出数据
查清数据库真实版本,再对表选驱动
驱动支持的不只是“能连上”,更是协议级兼容。例如:
- Oracle 11g 数据库不能用
ojdbc11.jar—— 它跳过了 11g 的旧认证流程,连接时大概率报ORA-28040: No matching authentication protocol - PostgreSQL 9.1 以下版本不被
pgjdbc 42.8.0+支持,升级后连接直接拒绝 - 查库版本用 SQL:
SELECT * FROM v$version;(Oracle)或SHOW server_version;(PostgreSQL)
扫清 classpath 多版本残留
多个 ojdbc 或 mysql-connector JAR 同时存在,是 LinkageError 和 ClassCastException 的头号原因:
立即学习“Java免费学习笔记(深入)”;
- Maven 项目执行:
mvn dependency:tree | grep -i jdbc,确认无ojdbc6、mysql-connector-java:5.1.x等旧版传递依赖 - 在
pom.xml中对老 starter 做<exclusion>,比如排除 Spring Boot 2.x 旧 starter 自带的ojdbc6 - 手动清理本地仓库:
rm -rf ~/.m2/repository/com/oracle/database/jdbc/*(保留目标版本即可) - IDE 中检查 “External Libraries”,确保只出现一个 JDBC JAR
验证驱动是否真被加载
别只信配置文件,用代码确认:
- 加一行日志:
System.out.println(DriverManager.getDrivers().asIterator().next()); - 若输出为
oracle.jdbc.driver.OracleDriver@xxx,说明加载的是旧版(ojdbc6或更早);oracle.jdbc.driver.OracleDriver在ojdbc8中已废弃,应看到oracle.jdbc.OracleDriver - MySQL 8+ 驱动类名必须是
com.mysql.cj.jdbc.Driver,不是com.mysql.jdbc.Driver



















