Java 11及以上必须用ojdbc11.jar,Java 8用ojdbc8.jar;禁用oracle.jdbc.driver.OracleDriver,改用oracle.jdbc.OracleDriver;Thin连接URL格式为jdbc:oracle:thin:@//host:port/service_name,用户名密码需单独URL编码。
Oracle JDBC驱动选ojdbc8.jar还是ojdbc11.jar?
用错驱动版本是连不上库的第一大原因,尤其在java 11+环境里硬塞ojdbc6.jar,直接抛java.lang.noclassdeffounderror: javax/xml/bind/datatypeconverter。oracle从jdk 9起移除了jaxb,老驱动依赖它,就会崩。
实操建议:
- Java 8 → 用
ojdbc8.jar(官方支持到JDK 8u201+,也兼容部分Java 11场景,但不推荐长期用) - Java 11 及以上 → 必须用
ojdbc11.jar(路径通常是$ORACLE_HOME/jdbc/lib/ojdbc11.jar,Maven坐标是com.oracle.database.jdbc:ojdbc11:23.5.0.23.09) - 别从网上随便下“免安装版ojdbc.jar”——签名缺失或被篡改会导致
SecurityException
oracle.jdbc.driver.OracleDriver已弃用,该注册哪个类?
Java 6之后JDBC规范要求自动服务发现,手动Class.forName("oracle.jdbc.driver.OracleDriver")不仅多余,还会在模块化项目(JPMS)里触发IllegalAccessError。
实操建议:
- 完全删掉
Class.forName(...)调用,JVM启动时会自动扫描META-INF/services/java.sql.Driver加载oracle.jdbc.OracleDriver - 如果要用显式加载(比如动态切换驱动),必须用新类名:
Class.forName("oracle.jdbc.OracleDriver"),旧类名在ojdbc8+中只是空壳,加载后不注册驱动实例 - 验证是否生效:调用
DriverManager.getDrivers(),看返回的Enumeration里有没有oracle.jdbc.OracleDriver@xxx
Thin连接字符串怎么写才不报Io exception: Connection refused?
这个错误90%不是网络问题,而是URL格式错、端口错、服务名/实例名混用,或者数据库监听没开。
立即学习“Java免费学习笔记(深入)”;
实操建议:
- 标准Thin URL格式:
jdbc:oracle:thin:@//<hostname>:<port>/<service_name></service_name></port></hostname>(注意双斜杠//和末尾的/,不是@后直接跟IP) - 别把
SID当service_name用——12c+默认启用了服务名,orcl可能是SID,但实际服务名可能是orclpdb1,查SELECT value FROM v$parameter WHERE name = 'service_names' - 端口确认是监听端口(默认1521),不是数据库内部端口;用
tnsping ORCL或telnet hostname 1521先测通不通 - 如果用RAC或Data Guard,URL里不能写单节点地址,得用SCAN或TNS别名(此时要配
tnsnames.ora并设oracle.net.tns_admin系统属性)
用户名密码带特殊字符(如@、/)时URL怎么编码?
URL里@、/、:是分隔符,明文写进去会破坏结构,导致SQLException: Missing IN or OUT parameter at index:: 1这类看似SQL错、实为解析错的问题。
实操建议:
- 对用户名、密码单独做URL编码,不是整个URL编码——用
URLEncoder.encode("p@ss/wd", "UTF-8")得到p%40ss%2Fwd - 完整URL示例:
jdbc:oracle:thin:@//localhost:1521/orclpdb1?user=admin&password=p%40ss%2Fwd(推荐用参数方式传凭证,比拼在URL里更安全) - 更稳妥的做法:用
Properties对象传参,避开URL解析歧义:Properties props = new Properties(); props.setProperty("user", "admin"); props.setProperty("password", "p@ss/wd"); Connection conn = DriverManager.getConnection(url, props);
最容易被忽略的是服务名大小写敏感性——Oracle服务名默认大写,但URL里小写通常也能连上;一旦启用了区分大小写的全局命名(names.default_domain配了域名),大小写错就直接拒绝连接,且错误信息里完全不提示这点。











