spring boot 2.x 连 oracle 的关键在于驱动类(oracle.jdbc.oracledriver)、url 格式(jdbc:oracle:thin:@host:port/service_name,用斜杠而非冒号)及 hikaricp 默认启用且需调优(如 maximum-pool-size=5、connection-timeout=30000),三者任一出错即启动失败。

Spring Boot 2.x 连 Oracle,关键不是“能不能连上”,而是「驱动类选对没、URL 格式对不对、连接池是否默认启用」——这三个点错一个,java.lang.ClassNotFoundException 或 Invalid JDBC URL 就直接报在启动日志里,不给你机会 debug。
Oracle 驱动依赖怎么加才不踩坑
别用 ojdbc6(JDBC 4.0,对应 Java 6),Spring Boot 2.x 默认基于 Java 8+,必须用 JDBC 4.2 兼容的驱动:
-
ojdbc8(推荐):适配 Oracle 12c/19c/21c,Maven 坐标是com.oracle.database.jdbc:ojdbc8:21.10.0.0(注意 groupId 已从com.oracle迁移) - 如果用旧版 Oracle(如 11g),可降级用
ojdbc7,但需确认 JDK 版本 ≤ 8u202 - 绝对避免
oracle.jdbc.driver.OracleDriver—— 这是已废弃的旧类名;统一用oracle.jdbc.OracleDriver
application.yml 中的 URL 必须符合 Oracle 12c+ 规范
Spring Boot 2.1+ 默认启用 HikariCP,它对 URL 校验更严格。SID 格式(@host:port:ORCL)在 12c+ 中已被弃用,改用 service name 格式:
- ✅ 正确写法:
jdbc:oracle:thin:@localhost:1521/ORCLPDB1(注意斜杠 /,不是冒号 :) - ❌ 错误写法:
jdbc:oracle:thin:@localhost:1521:ORCL→ 启动时报Invalid JDBC URL - 如果连的是 CDB(非 PDB),service name 通常是
XEPDB1或ORCL,可通过SELECT value FROM v$parameter WHERE name = 'db_name'确认
HikariCP 连接池参数要显式调优,不能全靠默认
Oracle 官方建议连接池最大连接数 ≤ 数据库进程数(processes 参数),否则会触发 ORA-12519。Spring Boot 2.x 的 HikariCP 默认 maximumPoolSize=10,对 Oracle 来说偏小:
- 加配置项:
spring.datasource.hikari.maximum-pool-size=5(保守起见,先设为 5) - 必须设
spring.datasource.hikari.connection-timeout=30000(30 秒),Oracle 建连慢,超时太短易失败 - Oracle 不支持
test-on-borrow,改用connection-test-query=SELECT 1 FROM DUAL - 别开
auto-commit:Oracle 默认事务手动提交,设成 true 可能导致隐式 commit 破坏业务逻辑
@Transactional 下 DataSource 切换失效?那不是配置问题,是根本没配双数据源
单数据源场景下谈「切换」毫无意义——@Transactional 绑定的是唯一数据源的 Connection,不存在切换前提。如果你看到「切不了」,大概率是:
- 误以为加了两个
spring.datasource.*配置就等于双数据源(其实只生效第一个) - 没配
@PrimaryBean,或没声明第二个DataSourceBean(Spring Boot 自动装配只认一个) - 想用
AbstractRoutingDataSource却漏写了ThreadLocal清理逻辑,导致异步线程里路由错乱
真要双 Oracle 数据源,优先用 dynamic-datasource-spring-boot-starter,它把 @DS 注解、事务隔离、连接池自动注册全包圆了——自己手写路由,光是 determineCurrentLookupKey() 返回 null 导致 fallback 到默认源这种静默失败,就够调半天。











