Spring Boot 3 集成 Oracle 19c 必须使用 ojdbc11(JDK 17+),URL 须为 service name 模式(如 @//host:port/XEPDB1),必须显式配置 spring.jpa.database-platform=org.hibernate.dialect.OracleDialect,主键禁用 IDENTITY 而应使用 @SequenceGenerator,生产环境禁用 ddl-auto。

Spring Boot 3 集成 Oracle 19c 必须用 ojdbc11(JDK 17+),ojdbc8 在 TLS 1.3 或高版本 Oracle Server 下 handshake 易失败;URL 必须用 service name 模式,spring.jpa.database-platform 必须显式指定,否则 fallback 到 H2 方言导致 DDL 执行失败。
依赖必须用 com.oracle.database.jdbc:ojdbc11,不能写错 groupId
Spring Boot 3.1+ 要求 JDK 17+,ojdbc8 已不兼容——运行时报 Unsupported major.minor version 是典型信号。Maven 坐标必须是:
<dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc11</artifactId> <scope>runtime</scope> </dependency>
常见错误:
-
groupId写成com.oracle.ojdbc或oracle.jdbc→ 构建失败或类找不到 - 同时引入
ojdbc8和ojdbc11→ 类加载冲突,报Cannot load driver class: oracle.jdbc.driver.OracleDriver - 没配 Oracle 官方仓库(
https://maven.oracle.com)且没手动安装 →Missing artifact,Maven 直接跳过
稳妥做法:从 Oracle 官网下载 ojdbc11.jar(对应 Oracle 19c/21c),用 mvn install:install-file 安装到本地仓库。
application.yml 的 URL 和方言配置不能省略
Oracle 19c 默认启用 PDB,连接 URL 必须用 service name 格式,且双斜杠 // 不可少:
spring:
datasource:
url: jdbc:oracle:thin:@//localhost:1521/XEPDB1
username: system
password: oracle
jpa:
database-platform: org.hibernate.dialect.OracleDialect
hibernate:
ddl-auto: none
关键点:
- 写成
@localhost:1521:XEPDB1(单斜杠 + 冒号)→ 解析失败,报Invalid Oracle URL specified - 漏掉
spring.jpa.database-platform→ Hibernate 自动 fallback 到H2Dialect,建表 SQL 生成错(如用identity而非sequence),启动直接失败 - 仍用
spring.jpa.database=oracle(Spring Boot 2.x 风格)→ 属性已废弃,无效且无提示
JPA 主键必须用 @SequenceGenerator,禁用 IDENTITY
Oracle 不支持自增列,GenerationType.IDENTITY 在 Spring Boot 3 + Hibernate 6 下会触发 ORA-00907: missing right parenthesis。正确方式是显式绑定序列:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
@SequenceGenerator(name = "user_seq", sequenceName = "USER_SEQ", allocationSize = 1)
private Long id;
}
注意:
- 数据库里必须提前建好
USER_SEQ序列,否则插入时报ORA-02289: sequence does not exist -
allocationSize = 1是必须项,Hibernate 6 对 Oracle 序列的默认步长假设为 50,会导致主键跳号 - 生产环境严禁设
ddl-auto: create或create-drop,Oracle 的 DDL 权限通常受限,且无法自动建序列
连接池超时和网络适配要单独调优
HikariCP 默认超时对 Oracle 不够友好,尤其在跨网段或高延迟场景下容易卡住:
spring:
datasource:
hikari:
connection-timeout: 30000
data-source-properties:
oracle.net.CONNECT_TIMEOUT: 10000
oracle.net.READ_TIMEOUT: 20000
不加 oracle.net.CONNECT_TIMEOUT 的后果:
- Hikari 只等 30 秒,但 Oracle JDBC 底层可能再重试 3 次 × 30 秒,最终报
IO Error: The Network Adapter could not establish the connection,日志看不出根本原因 - 连接池初始化失败后不抛明确异常,而是静默 fallback 到空数据源,后续 DAO 调用直接 NPE
另外,Oracle 19c 默认启用 TLS 1.3,若 JDK 版本低于 17u25 或驱动未更新,handshake 会失败——此时看日志只有 javax.net.ssl.SSLHandshakeException,得回退到 ojdbc11 并确认 JDK 补丁级别。


















