可以,但需JDK 1.8且服务端未强制高安全协议;ojdbc7支持11g与19c交集协议,属勉强可用方案。
ojdbc7 能不能同时连 11g 和 19c
可以,但有明确前提:jdk 必须是 1.8,且数据库端未强制启用高安全认证协议(如 sqlnet.allowed_logon_version=12 或更高)。ojdbc7 内部支持的认证协议范围较宽,能覆盖 11g 的旧协议和 19c 的部分兼容模式,属于“勉强可用”的交集方案。
常见踩坑点:
-
ojdbc7在连接 19c 时若遇到ORA-28040,大概率是服务端sqlnet.ora中设置了SQLNET.ALLOWED_LOGON_VERSION_SERVER=12(或12a),此时ojdbc7已被明确拒绝 - 连接 11g 时若报
NoSuchMethodError: oracle.i18n.text.converter.CharacterConverterOGS.getInstance,说明混用了orai18n.jar,而该 jar 与ojdbc7不匹配,应移除或换用完整包(如ojdbc7-full.jar) - 字符集为
ZHS16GBK时,ojdbc7可能无法正确处理某些多字节边界场景,建议在 11g 端确认 NLS 设置,并避免在 19c 环境中复用该字符集
ojdbc8 是不是 11g/19c 的通用解
ojdbc8(版本 12.2.0.1+)是目前最稳妥的跨版本驱动选择,官方明确声明支持 Oracle 12.1 至 21c,自然涵盖 11g(需补丁)和 19c 全系列。
但它不是“无条件通用”,关键约束如下:
- 必须搭配
JDK 1.8或JDK 11;JDK 17+需用ojdbc11,否则会触发ClassNotFoundException(如javax.xml.bind.DatatypeConverter) - 连接 11g 时若报
Non supported character set (add orai18n.jar in your classpath): ZHS16GBK,不是驱动问题,而是orai18n.jar缺失或版本不匹配——ojdbc8不再内置字符集转换器,必须显式引入对应版本的orai18n.jar - 若 11g 数据库未打关键补丁(如
11.2.0.4.200114),ojdbc8可能因缺少对旧内核握手逻辑的支持而连接超时,此时应回退到ojdbc7或升级数据库补丁
为什么 ojdbc6 连 19c 必然失败
ojdbc6(对应 Oracle 11g 官方主力驱动)不支持 19c 默认启用的认证协议套件,连接时几乎必然抛出 ORA-28040: No matching authentication protocol。这不是配置问题,而是协议能力缺失。
深层原因在于:ojdbc6 实现的是 Oracle 11g 时代的 SQL*Net 认证流程,不包含对 SHA-2 密钥交换、TLS 1.2+ 握手、以及 ASO(Advanced Security Option)增强机制的支持。而 19c 默认禁用所有低于 12a 级别的登录协议,ojdbc6 连不上是设计使然,不是 bug。
绕过方式极不可取:
- 修改服务端
sqlnet.ora中的SQLNET.ALLOWED_LOGON_VERSION_SERVER=8—— 直接削弱全库认证强度,违反等保/合规要求 - 尝试用
ojdbc6 + orai18n.jar组合 —— 仍会卡在协议协商阶段,orai18n.jar只管字符转换,不管认证
Maven 里怎么写才不翻车
不要只写 ojdbc8,必须锁定坐标和 classifier,否则可能拉到错误变体(如仅含源码的 -sources 包)。
推荐写法(以 Maven 为例):
<dependency><groupid>com.oracle.database.jdbc</groupid><artifactid>ojdbc8</artifactid><version>21.10.0.0.1</version></dependency><dependency><groupid>com.oracle.database.nls</groupid><artifactid>orai18n</artifactid><version>21.10.0.0.1</version></dependency>
注意点:
- 使用
com.oracle.database.jdbc坐标,而非过时的com.oracle;后者在 Maven Central 上已归档,且不含最新补丁 -
orai18n必须与ojdbc8同版本号,不同版本混合会导致CharacterConverter类加载冲突 - 如果项目用 Spring Boot 2.7+,需额外排除 HikariCP 自带的旧驱动,否则可能触发双驱动加载异常
compatible 参数与客户端驱动之间的隐式耦合——它不报错,但会让某些元数据查询(如 DBA_TAB_COLUMNS 字段长度)返回异常值,这种问题往往要等到上线后查数据时才暴露。











