Java 8+ 项目统一用 ojdbc8,它支持 JDK 8–21;ojdbc11 仅适用于 JDK 21+ 新项目且需 JEP 396 特性。日常开发、连接、事务、LOB 操作无需 ojdbc11。

Oracle JDBC驱动怎么选:ojdbc8还是ojdbc11?
Java 8+ 项目统一用 ojdbc8,哪怕你用的是 JDK 17 或 21;JDK 21+ 新项目才考虑 ojdbc11。Oracle 官方明确说明:ojdbc8 支持 JDK 8–21(含 LTS 和非 LTS),而 ojdbc11 仅面向 JDK 11+ 的特定新特性(如 JEP 396 封闭包支持),日常连接、事务、LOB 操作完全不需要它。
常见踩坑点:
- Maven 里误引
ojdbc6(只支持 JDK 6/7),运行时报java.lang.UnsupportedClassVersionError - 从 Oracle 官网下载时选错包:要下载
ojdbc8.jar(不是ucp.jar或orai18n.jar,除非你真需要连接池或国际化) - Spring Boot 3.x 默认启用 Jakarta EE 9+,需确认
ojdbc8版本 ≥ 21.9.0.0(否则DataSource初始化失败)
URL格式和关键参数不能硬编码
Oracle JDBC URL 标准格式是:jdbc:oracle:thin:@//host:port/service_name(注意双斜杠和 service_name,不是 SID)。用错格式最常导致 Io exception: Connection refused 或 Invalid Service Name。
必须显式配置的参数(尤其在生产环境):
立即学习“Java免费学习笔记(深入)”;
-
oracle.net.CONNECT_TIMEOUT=10000:避免 DNS 慢导致连接卡死 -
oracle.jdbc.ReadTimeout=30000:防止查询阻塞线程过久 -
oracle.jdbc.defaultRowPrefetch=50:提升批量查询性能(默认是 10,太小) -
useUnicode=true&characterEncoding=UTF-8:对中文字段生效(ojdbc8实际忽略该参数,但保留无害;真正生效靠数据库端字符集 AL32UTF8)
示例完整 URL:jdbc:oracle:thin:@//db.example.com:1521/ORCLPDB1?oracle.net.CONNECT_TIMEOUT=10000&oracle.jdbc.ReadTimeout=30000&oracle.jdbc.defaultRowPrefetch=50
用户名密码别写死,更别用 sys/system
开发阶段用普通用户(如 app_user),权限只授予所需表的 SELECT/INSERT/UPDATE;生产环境必须禁用 sys、system 等 DBA 账号——它们绕过所有审计策略,且一旦泄露等于交出整库控制权。
密码管理建议:
- Spring Boot:用
spring.datasource.hikari.password=${DB_PASSWORD}+ 环境变量或 HashiCorp Vault 注入 - 纯 JDBC:从
System.getProperty("user.home") + "/.oracle-creds"文件读取(文件权限设为 600) - 绝对不要出现在
application.properties明文里,也别用 Base64 做“伪装”(毫无安全性)
HikariCP 连接池配置不调参等于白用
Oracle 官方推荐 HikariCP,但默认配置在高并发下极易触发 Connection is not available, request timed out after 30000ms。关键三项必须调:
-
maximumPoolSize:建议设为数据库最大连接数 × 0.8(查v$parameter中processes值) -
connection-timeout:建议 ≤ 3000(毫秒),比 Oracle 的CONNECT_TIMEOUT小一点,快速失败 -
validation-timeout:必须设为2000,且搭配connection-test-query=SELECT 1 FROM DUAL(Oracle 不支持isValid()快检)
漏掉 connection-test-query 会导致连接池返回已断开的连接,应用直接抛 SQLException: Closed Connection。









