ojdbc8(12.2.0.1+)是连接Oracle 19c的必要前提,因ojdbc6/7不支持19c默认启用的12C及以上认证协议,导致握手失败并抛ORA-28040;必须使用com.oracle.database.jdbc:ojdbc8:x.x.x坐标,且需搭配JDK 8或11。
直接结论:不是java 8版本低,而是你用的ojdbc驱动太旧。必须换用ojdbc8(12.2.0.1 或更高),且不能是ojdbc6或ojdbc7。
为什么ojdbc6和ojdbc7连不上19c?
Oracle 19c 默认禁用老协议(比如10G密码哈希),而ojdbc6只支持到11g协议,ojdbc7虽支持部分12c特性,但缺少对19c默认启用的12C及以上认证协议的完整实现。连接时双方“说不到一块儿”,数据库直接拒绝,抛出ORA-28040。
常见错误现象:
- 应用启动失败,日志里只有
ORA-28040: No matching authentication protocol,无其他堆栈 - 即使URL、用户名、密码全对,
DriverManager.getConnection()仍抛异常 - 用
ojdbc8替换后立刻恢复,无需改代码
怎么选对ojdbc8版本?
别被名字误导——ojdbc8的“8”指JDK兼容性,不是数据库版本。它支持Oracle 12c、18c、19c、21c。关键看小版本号:
- 必须用
ojdbc812.2.0.1 或更新(如19.3.0.0、21.1.0.0) - 避免用
ojdbc8-12.1.0.2——这个版本对19c支持不完整,仍有概率触发ORA-28040 - Maven坐标示例:
com.oracle.database.jdbc:ojdbc8:21.1.0.0(推荐,官方最新稳定版)
如果必须保留旧驱动,临时绕过怎么办?
仅限测试或紧急维保场景,不建议上线使用。需在数据库服务器修改sqlnet.ora:
立即学习“Java免费学习笔记(深入)”;
- 添加或修改参数:
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8 - 该参数让19c接受
8i及以上协议,兼容ojdbc6 - 注意:改完后,已有用户密码需重置一次(如
ALTER USER scott IDENTIFIED BY newpass;),否则可能叠加ORA-01017 - 此操作降低安全强度,19c默认禁用
10G以下协议是有原因的
真正可靠的解法,永远是升级驱动而非降级数据库配置。很多团队卡在这一步,是因为把ojdbc8当成“可选升级”,其实它是19c的**连接前提条件**——就像你不能用IE6访问现代Web应用,不是IE6不好,而是协议已淘汰。


















