ojdbc.jar版本选错是连不上库的第一大原因:Java 11+环境下硬塞ojdbc6或ojdbc8会因JDK 9起移除JAXB而报NoClassDefFoundError;应严格按运行时JVM版本匹配——JDK 8用ojdbc8.jar,JDK 11+必须用ojdbc11.jar。

ojdbc.jar版本选错,连不上库的第一原因
Java 11+ 环境下硬塞 ojdbc8.jar 或更老的 ojdbc6.jar,几乎必报 java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter。JDK 9 起移除了 JAXB,而老驱动依赖它。
- Java 8 → 用
ojdbc8.jar(官方支持到 JDK 8u201+;部分 Java 11 场景能跑,但不保证长期稳定) - Java 11 及以上 → 必须用
ojdbc11.jar(Maven 坐标:com.oracle.database.jdbc:ojdbc11:23.5.0.23.09;路径通常为$ORACLE_HOME/jdbc/lib/ojdbc11.jar) - 别从非官方渠道下载“免安装版 ojdbc.jar”——签名缺失或篡改会触发
SecurityException
Driver 类名写错,注册失败却没报错
oracle.jdbc.driver.OracleDriver 已弃用,在 ojdbc8+ 中只是空壳类,加载后不注册驱动实例;手动调用 Class.forName("oracle.jdbc.driver.OracleDriver") 不仅多余,还可能在模块化项目(JPMS)里引发 IllegalAccessError。
- 完全删掉
Class.forName()调用:JDBC 4.0+ 规范支持自动服务发现,JVM 启动时会扫描META-INF/services/java.sql.Driver加载oracle.jdbc.OracleDriver - 如需动态加载(比如多数据源切换),必须用新类名:
Class.forName("oracle.jdbc.OracleDriver") - 验证是否生效:调用
DriverManager.getDrivers(),检查返回的Enumeration里是否有oracle.jdbc.OracleDriver@xxx
URL 格式写错,Connection refused 其实不是网络问题
报 Io exception: Connection refused,90% 是 URL 写法错误,而非防火墙或监听没开。
- 标准 Thin URL 格式:
jdbc:oracle:thin:@//host:port/service_name(注意双斜杠//和末尾的/,不是@host:port:sid) - 别把 SID 当 service_name:12c+ 默认启用服务名,
orcl可能是 SID,但实际服务名可能是orclpdb1;查 SQL:SELECT value FROM v$parameter WHERE name = 'service_names' - 端口确认是监听端口(默认 1521),不是数据库内部端口;先用
tnsping ORCL或telnet hostname 1521测通不通 - RAC 或 Data Guard 场景不能写单节点地址,得用 SCAN 或 TNS 别名,并配
oracle.net.tns_admin系统属性指向tnsnames.ora目录
oci 和 thin 混用,配置逻辑全乱
Thin 是纯 Java 实现,OCI 需本地 Oracle 客户端支持,两者不可混用——URL、驱动 jar、环境变量全不同。
- Thin 连接字符串示例:
jdbc:oracle:thin:@//192.168.3.98:1521/orclpdb.example.com;只需ojdbcXX.jar在 classpath - OCI 连接字符串示例:
jdbc:oracle:oci8:@xe;必须装 Oracle 客户端(或 Instant Client),且配置好tnsnames.ora和NLS_LANG环境变量 - 切换方式不是改 URL 就完事:OCI 驱动 jar 名是
ojdbcXX.jar(同 thin),但运行时依赖本地oci.dll/libociei.so;没装客户端或路径不对,直接UnsatisfiedLinkError


















