ojdbc8.jar是Java 17下连接Oracle 11g至21c的首选驱动,支持JDK 8~21且协议兼容性最广;ojdbc11.jar仅适用于21c+且启用新认证协议的场景,误用于11g/12c会报ORA-28040。
java 17 下用 oracle 官方 jdbc 驱动连接 oracle 数据库,根本不用“开源驱动”——oracle 官方早已提供完全兼容 jdk 17 的 ojdbc8.jar,且它才是生产环境唯一推荐的选择。所谓“开源驱动”(如 ucp、apache commons dbcp2 等)只是连接池或工具层,底层仍依赖 oracle 官方的 ojdbc;而 ojdbc11.jar 在 jdk 17 下反而可能因数据库版本不匹配导致连接失败。
该用 ojdbc8 还是 ojdbc11?看数据库版本,不是看 JDK 版本
常见错误:看到项目用 JDK 17,就下意识选 ojdbc11,结果连 Oracle 11g 或 12c 报 ORA-28040: No matching authentication protocol。
- 你的 Oracle 数据库是 11g/12c/19c/21c 全系列?→ 用
ojdbc8-21.12.0.0.jar(或更高小版本),它支持 JDK 8~21,且协议兼容性最广 - 数据库是 21c+ 且明确启用了 TLS 1.2+ 和新认证方式?→ 可试
ojdbc11-23.7.0.24.07.jar,但必须确认 DBA 已关闭旧协议回退 - 查清真实数据库版本:
SELECT * FROM v$version,再核对 Oracle 官方 JDBC FAQ 中 “Supported Database Versions” 表格 - Maven 坐标必须用 Oracle 官方仓库:
com.oracle.database.jdbc:ojdbc8:21.12.0.0,别用 Maven Central 上无签名的镜像包(缺模块声明,JDK 17 模块化项目会挂)
classpath 里混了多个 ojdbc.jar?LinkageError 就是它干的
典型现象:java.lang.LinkageError: loader constraint violation,或运行时抛 oracle.jdbc.driver.T4CConnection cannot be cast to java.sql.Connection。
- 执行
mvn dependency:tree | grep ojdbc,确认是否同时存在ojdbc6、ojdbc7、ojdbc8 - 在 pom.xml 中显式排除老版本传递依赖,例如 Spring Boot 2.x starter 带的
ojdbc6:<exclusion> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> </exclusion>
- 删掉本地仓库中非目标版本:
rm -rf ~/.m2/repository/com/oracle/database/jdbc/*ojdbc[67]* - IDE 中刷新 Maven 后,检查 External Libraries 列表——只应剩一个
ojdbc8-*.jar
模块化项目(module-info.java)必须写 requires oracle.jdbc
哪怕你只调用 DriverManager.getConnection(),不直接 import Oracle 特有类,也必须声明依赖。否则编译期报 module not found: oracle.jdbc,或运行时报 No suitable driver(类加载器隔离导致驱动未被发现)。
- module-info.java 中写法必须是:
module my.app { requires java.sql; requires oracle.jdbc; // 关键,不可省略 exports com.myapp.db; } - 不要加
requires transitive oracle.jdbc——ojdbc8 不导出第三方模块,且你的代码通常只用java.sql接口 - 非模块化项目(无 module-info.java)可跳过此步,但需确保启动时不加
--add-modules强制导入,否则可能干扰类加载顺序
URL 格式和 TLS 参数错一个字符,连接就静默超时
Oracle 21c+ 默认禁用旧加密套件,继续用 SID 格式(:XE)或不指定 SSL 参数,大概率握手失败,日志里只有 IO Error: Connection reset 或长时间卡住。
立即学习“Java免费学习笔记(深入)”;
- 必须改用服务名格式:
jdbc:oracle:thin:@localhost:1521/XE(注意是/XE,不是:XE) - 若数据库启用了 SSL/TLS,追加参数:
?oracle.net.ssl_version=1.2&oracle.net.encryption_client=REQUIRED - 纯本地开发调试可临时加
&oracle.jdbc.javaNetNio=false避免 NIO 相关偶发超时 -
Driver类名保持oracle.jdbc.driver.OracleDriver即可,ojdbc8 已自动注册,无需Class.forName()
真正容易被忽略的是:ojdbc8.jar 的小版本号必须锁定。用 ojdbc8-latest.jar 或不指定版本号,Maven 可能拉取到带 bug 的快照版,导致连接池初始化失败、PreparedStatement 批处理异常等静默问题——这些在本地测不出,上线后才爆发。



















