必须使用ojdbc8.jar、service name格式url(@//host:port/service_name)及显式driver-class-name=oracle.jdbc.oracledriver,三者缺一不可;maven需排除旧版ojdbc,hikaricp 5+不再自动推导驱动类,oracle 19c多租户下sid失效,connection-test-query须设为select 1 from dual,驱动级超时参数需拼在url末尾。

必须用 ojdbc8.jar,URL 必须用 service name 格式(@//host:port/SERVICE_NAME),且 driver-class-name 必须显式设为 oracle.jdbc.OracleDriver——缺一不可,否则连不上。
ojdbc8.jar 和 driver-class-name 怎么配才不报 ClassNotFoundException
Oracle 19c 只认 ojdbc8.jar(JDK 8 兼容),Maven 中要排除所有旧版 ojdbc(尤其是 ojdbc6):
<dependency><groupid>com.oracle.database.jdbc</groupid><artifactid>ojdbc8</artifactid><version>21.10.0.0</version><exclusions><exclusion><groupid>com.oracle</groupid><artifactid>ojdbc6</artifactid></exclusion></exclusions></dependency>
HikariCP 5+ 已弃用自动推导驱动类,必须显式指定:
-
driver-class-name=oracle.jdbc.OracleDriver(注意不是oracle.jdbc.driver.OracleDriver,后者在新版驱动中已弃用) - 若用 Spring Boot,配置项是
spring.datasource.hikari.driver-class-name - 不设或写错会直接抛
Unable to load class: oracle.jdbc.driver.OracleDriver
jdbcUrl 必须用 service name,不能用 SID
Oracle 19c 默认启用了多租户(CDB/PDB),SID 在容器化或 PDB 环境下基本失效;service name 才是唯一可靠标识。
正确格式带双斜杠和 service name:
jdbc:oracle:thin:@//localhost:1521/ORCLPDB1
错误示例(会连上但后续执行 SQL 报 ORA-12514):
-
jdbc:oracle:thin:@localhost:1521:orcl(SID 格式,已过时) -
jdbc:oracle:thin:@localhost:1521/ORCLPDB1(少一个/,解析失败)
如果要用 TNSNAMES,必须设置 TNS_ADMIN 环境变量,并在 URL 中写别名:jdbc:oracle:thin:@MYDB。
connection-test-query 必须设成 SELECT 1 FROM DUAL
HikariCP 默认的 SELECT 1 在 Oracle 下直接报 SQLSyntaxErrorException,连接池初始化就会失败。
必须显式覆盖:
-
connection-test-query=SELECT 1 FROM DUAL(Oracle 12c+ 推荐) - 不要用
SELECT SYSDATE FROM DUAL,它在某些驱动变体里仍可能触发隐式事务 - 更稳妥的做法是关掉它(不设该参数),改用
validation-timeout=2500+idle-timeout=600000+max-lifetime=1800000组合保活
注意:connection-test-query 是连接从池中取出时执行的语句,不是建连时验证——建连超时由 Oracle 驱动参数控制(如 oracle.net.CONNECT_TIMEOUT)。
Oracle 驱动级超时参数必须拼在 jdbcUrl 末尾
connection-timeout(HikariCP 参数)只管“从池里取连接”的等待时间,不管 TCP 连接或 Oracle 登录。真正控制底层网络的是 Oracle 驱动识别的参数,必须拼在 URL 后面:
jdbc:oracle:thin:@//localhost:1521/ORCLPDB1?oracle.net.CONNECT_TIMEOUT=5000&oracle.jdbc.ReadTimeout=30000&oracle.jdbc.SocketTimeout=30000
关键点:
-
oracle.net.CONNECT_TIMEOUT:TCP 握手和登录阶段超时,建议 5000ms -
oracle.jdbc.ReadTimeout:读取响应超时,应 ≥connection-timeout(HikariCP 的 30000ms) -
oracle.jdbc.SocketTimeout:Socket 级读写超时,和 ReadTimeout 通常设一样 - 这些参数 HikariCP 不解析,只原样传给 Oracle 驱动;写错名字(比如写成
connectTimeout)就无效
最容易被忽略的是:RAC 场景下若没配 FAILOVER_MODE 在 tnsnames.ora 里,单节点宕机后连接会卡死数秒再抛 SQLRecoverableException,而不是自动切走。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











