spring boot连接oracle rac必须使用以@(description=开头的tns描述符格式,否则datasource初始化失败返回null;需ojdbc8+驱动、dns可解析scan域名、显式配置failover=on和load_balance=on,且关键字大小写敏感、括号完整、无多余空格或引号。

Spring Boot 项目里配 Oracle RAC,不写对 TNS 描述符格式,DataSource 就是 null —— 连连接尝试都不会发生,日志只报 “failed to configure a datasource”。
必须用 @(DESCRIPTION= 开头的 TNS 格式
ojdbc8+ 驱动只在 URL 以 @(DESCRIPTION= 开头时才启用 RAC 模式。写成 jdbc:oracle:thin:@rac-scan.example.com:1521:ORCLCDB 这种单机格式,驱动直接当普通库处理,不会解析 SCAN、不会触发负载均衡,DataSource 初始化失败且静默返回 null。
- 整个连接串必须包裹在
@(DESCRIPTION=...)内,不能外层加引号、空格或换行 -
ADDRESS、CONNECT_DATA、FAILOVER等关键字大小写敏感,不能写成address或failover=on(小写) - 漏一个右括号、多一个等号、HOST 值 DNS 不可解析,都会导致 URL 无效,且无明确报错
SCAN IP 必须走 DNS 解析,不能填 IP 或 VIP
SCAN 是协议层负载入口,不是别名。驱动靠 DNS 返回多个 A 记录做轮询,硬编码多个 ADDRESS 反而干扰行为。
-
HOST值必须是可被 Spring Boot 所在服务器解析的 SCAN 域名(如rac-scan.example.com),不能是节点 VIP 或 IP - 用
nslookup rac-scan.example.com验证:应返回 3 个 IP(RAC 标准配置),只返回 1 个也能连,但负载失效 - TNS_ADMIN 环境变量若设置,值应为目录路径(如
/etc/oracle/network),不是文件路径;设错会导致驱动忽略 SCAN 行为
FAILOVER 和 LOAD_BALANCE 参数要显式写进括号内
这两个开关必须出现在 TNS 描述符内部,且只能是 on,不是 true、yes 或数字。
- 正确写法:
(FAILOVER=on)(LOAD_BALANCE=on),位置在DESCRIPTION下一级,和ADDRESS同级 - URL 末尾还要补上查询参数:
?loadBalance=true&failover=true(注意 & 要转义为&,且全小写) - 没写
FAILOVER_MODE也不影响基础故障转移,但若需 SELECT 级透明切换(TAF),得加:(FAILOVER_MODE=(TYPE=select)(METHOD=basic))
ojdbc 版本低于 8 就别试了
ojdbc6 完全忽略 LOAD_BALANCE 和 FAILOVER 参数,ojdbc7 对 SCAN 支持不稳定。只有 ojdbc8 及以上才真正启用 RAC 协议栈。
- Maven 依赖必须用
com.oracle.database.jdbc:ojdbc8(注意 groupId 已变更),不要用老的oracle.jdbc:ojdbc6 - 确认 classpath 中无旧版 ojdbc jar,冲突会导致驱动降级行为
- 连接成功后,查
v$instance应看到当前连接的实例名(如orcl1),多次请求应轮换出现不同实例名,才是负载生效
最容易被忽略的是:TNS 格式错误 + DNS 不通 + 驱动版本低,这三者叠加会让问题看起来像“配置没生效”,其实根本没走到连接阶段。先验证 DNS 和驱动版本,再抠括号和大小写,比反复改 URL 有效得多。











