ojdbc8依赖必须使用com.oracle.database.jdbc groupid,spring boot 3(jdk 17+)推荐版本21.10.0.0,支持oracle 19c、tls 1.2+及时区设置,url须用服务名格式并配alter session set time_zone。

ojdbc8 依赖必须用 com.oracle.database.jdbc groupId
Spring Boot 3 默认要求 JDK 17+,而 Oracle 官方对 JDK 17+ 的支持只覆盖到 ojdbc8(对应 Oracle 12c–19c)和 ojdbc11(19c+)。旧的 com.oracle:ojdbc6 或 com.oracle:ojdbc7 在 Maven 中已不可解析,IDEA 会标红并报 Could not resolve artifact。
正确写法是:
<dependency><groupid>com.oracle.database.jdbc</groupid><artifactid>ojdbc8</artifactid><version>21.10.0.0</version><scope>runtime</scope></dependency>
- 别用
com.oracle.ojdbc(这是过时的 groupId,部分镜像站仍缓存但不推荐) - 版本选
21.10.0.0或更高(2026 年最新稳定版),它完整支持 JDK 17/21 和 Oracle 19c 的 TLS 1.2+、AL32UTF8 字符集、XA 事务等特性 - 若内网无法拉远程依赖,可手动下载
ojdbc8.jar放入lib/,并在 pom 中用<scope>system</scope>+<systempath></systempath>指向——但上线前务必切回标准托管方式,避免部署一致性风险
URL 必须用服务名格式 /service_name,不是 :SID
Oracle 19c 默认启用多租户(CDB/PDB),数据库实例名(SID)基本弃用,连接必须用服务名(SERVICE_NAME),否则启动时报 IO Error: The Network Adapter could not establish the connection 或直接超时。
正确 URL 示例:
spring.datasource.url=jdbc:oracle:thin:@localhost:1521/ORCLPDB1
- 注意是斜杠
/,不是冒号:;写成@localhost:1521:ORCLPDB1会静默失败 - 如果用了 RAC、防火墙或非默认端口,必须用完整描述符:
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.5)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCLPDB1))) -
tnsnames.ora文件里的SERVICE_NAME值必须和 DBA 提供的一致,大小写敏感
必须配 connection-init-sql 设置会话时区
Oracle 19c 实例默认 TIME_ZONE = 'UTC',而 Spring Boot 3 使用 java.time 类型读取时间字段时,ojdbc8 驱动会按会话时区做隐式转换。没设时区会导致 LocalDateTime 少 8 小时(Asia/Shanghai 场景下)。
错误做法:往 URL 加 serverTimezone=Asia/Shanghai —— ojdbc8 完全不识别该参数,加了也无效。
正确配置:
spring:
datasource:
hikari:
connection-init-sql: ALTER SESSION SET TIME_ZONE = 'Asia/Shanghai'
- 单引号必须,写成双引号或不带引号会触发
ORA-00922: missing or invalid option - 该 SQL 在每次连接从 Hikari 连接池获取时执行,确保每个会话都生效
- 如果还用了
@JsonFormat或spring.jackson.time-zone,那是控制 JSON 序列化,和数据库读写无关,两者要分开配
Hibernate 6 的方言不用显式指定
Spring Boot 3 内置 Hibernate 6,其 OracleDialect 默认适配 Oracle 19c+。如果你连的是 19c,不要在配置里写 spring.jpa.database-platform=org.hibernate.dialect.OracleDialect,否则日志会刷出 HHH90000025 警告,且可能干扰自动方言探测。
只需确保:
- 驱动是
ojdbc8或更高 - URL 中服务名能连通,Hibernate 启动时会自动执行
SELECT * FROM V$VERSION判断版本 - 如果项目同时连 Oracle 11g/12c,才需要引入
hibernate-community-dialects并显式指定方言;19c 不需要
复杂点在于:时区设置和驱动版本绑定极紧,哪怕 URL 和账号都对,只要 ojdbc8 版本低于 21.3.0.0,某些时间函数(如 SYSTIMESTAMP AT TIME ZONE)可能返回 null;建议直接上 21.10.0.0 或 23.10.0.0。











