Oracle JDBC驱动需严格匹配JDK和数据库版本:JDK 8用ojdbc8.jar,JDK 11+用ojdbc11.jar或更高;连接URL须区分SID与service_name,PDB推荐用/jdbc:oracle:thin:@host:port/service_name/语法。

Oracle JDBC驱动版本和JAR包怎么选?
Oracle 官方从 18c 开始不再默认提供 ojdbc6.jar 或 ojdbc7.jar,必须按 JDK 版本和 Oracle 数据库版本严格匹配驱动。用错会直接报 java.lang.UnsupportedClassVersionError 或 ClassNotFoundException。
- JDK 8 → 优先用
ojdbc8.jar(支持 Oracle 12c/18c/19c/21c) - JDK 11+ → 必须用
ojdbc11.jar或更高(如ojdbc12.jar),ojdbc8.jar在 JDK 17+ 上可能触发LinkageError - 别从非官方渠道下载 JAR;去 Oracle JDBC Downloads 页面 下载,需登录 Oracle 账号
- 如果用 Maven,声明依赖时注意 scope:
<scope>runtime</scope>(驱动不参与编译,只在运行时加载)
连接 URL 格式写错会导致 ORA-12505 或 ORA-01017
Oracle 的 JDBC URL 不像 MySQL 那样宽松,service_name、sid、server name 混用会直接连不上。最稳妥的是用 Easy Connect Plus 语法,尤其在 12c+ 使用 PDB 场景下。
- 连接 CDB(非容器库):
jdbc:oracle:thin:@host:port:ORCL(ORCL是 SID) - 连接 PDB(推荐):
jdbc:oracle:thin:@host:port/service_name(注意是/不是:,且service_name区分大小写) - 带 wallet 或 TLS 连接时,URL 必须含
?oracle.net.ssl_server_dn_match=true,否则报Io exception: Invalid number format for port number - 避免硬编码密码——改用
OracleDataSource.setConnectionProperties(...)动态传参,或用DriverManager.getConnection(url, props)
ORA-17002:TNS 无法解析,但 tnsping 又通怎么办?
这通常不是网络问题,而是 JDBC 驱动没读到正确的 TNS 配置,或客户端未启用 Oracle Net Services 支持。
- 不要把
tnsnames.ora放在项目 resources 下就以为能自动加载;JDBC Thin 驱动默认不读该文件,除非显式设置系统属性:System.setProperty("oracle.net.tns_admin", "/path/to/network/admin") - 若用
jdbc:oracle:thin:@(DESCRIPTION=...)这种长连接串,确保括号完全匹配、无中文空格、等号前后无空格,否则解析失败静默报 ORA-17002 - 检查数据库监听是否允许远程连接:
lsnrctl status输出中要有STATUS of the LISTENER is READY,且HOST不是127.0.0.1 - Spring Boot 用户注意:
spring.datasource.url中的特殊字符(如@、/)要 URL 编码,否则配置被截断
连接池里 setValidConnectionCheckerClassName 不生效?
HikariCP、Druid 等主流连接池默认用 isValid() 做校验,但 Oracle 的 Connection.isValid(int) 在某些驱动版本(尤其是 ojdbc8 19.22 之前)存在 bug:超时返回 false 却不抛异常,导致连接被误判为失效并销毁。
- 临时绕过方式:用自定义 validation query,例如
SELECT 1 FROM DUAL(注意结尾不能有分号) - HikariCP 推荐配:
connection-test-query=SELECT 1 FROM DUAL+connection-timeout=3000 - Druid 用户请确认
validationQuery和testOnBorrow同时开启,且驱动版本 ≥ojdbc8-21.9.0.0 - 别信网上“设
valid-connection-checker-class-name就万事大吉”的说法——Oracle 驱动对这个接口的支持一直不稳定
真正麻烦的不是配 URL 或加 JAR,而是不同 Oracle 版本、JDK 版本、连接池组合下,同一行代码可能今天正常明天报错。建议把驱动版本、JDK 版本、数据库版本三者写死在 build.gradle 或 pom.xml 注释里,不然排查时容易漏掉关键变量。



















