必须使用ojdbc8+驱动、显式写全3个SCAN地址、URL中添加loadBalance=true且三者缺一不可,否则Java应用始终只连首个SCAN IP;tnsnames.ora需完整列出3个SCAN域名并用ADDRESS_LIST包裹,LOAD_BALANCE=on须小写,DNS解析必须返回3个不同IPv4地址。

必须用 ojdbc8+、显式写全 SCAN 地址、URL 里加 loadBalance=true,三者缺一不可——否则 Java 应用永远只连第一个 SCAN IP。
tnsnames.ora 必须显式列出全部 3 个 SCAN 地址
Oracle JDBC Thin 驱动(包括所有 ojdbc 版本)根本不会主动查 DNS 轮询结果。它只按你在 tnsnames.ora 里写的顺序尝试连接。
-
ADDRESS_LIST必须包裹全部 3 个ADDRESS,不能拆成多个独立DESCRIPTION -
LOAD_BALANCE = on必须是小写on,写成yes、true或ON都会被静默忽略 -
HOST字段填可解析的 SCAN 域名(如rac-scan1.example.com),不能填 IP 或 VIP - 验证方式:
nslookup rac-scan.example.com输出必须是三行不同 IPv4 地址
JDBC URL 必须带 loadBalance=true&failover=true
仅靠 tnsnames.ora 里的 LOAD_BALANCE = on 对 Java 完全无效。JDBC 驱动需要显式参数控制行为,且只在 ojdbc8.jar 及以上版本完整支持。
- URL 中
loadBalance=true和failover=true必须小写,大小写错误直接丢弃参数 - 不能只依赖
spring.datasource.hikari.jdbc-url拼接一部分地址——必须把全部 3 个 SCAN 的ADDRESS结构和LOAD_BALANCE=on全部写进 URL 字符串 - 示例片段:
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=rac-scan1.example.com)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=rac-scan2.example.com)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=rac-scan3.example.com)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl))(LOAD_BALANCE=on))?loadBalance=true&failover=true -
ojdbc6会静默忽略这些参数,ojdbc7支持不完整,必须用ojdbc8或更高
TNS_ADMIN 环境变量必须指向正确目录
Java 进程启动前必须设置 TNS_ADMIN,且值必须是包含 tnsnames.ora 和 sqlnet.ora 的父目录路径,比如 /etc/oracle/network,而不是文件路径。
- 设错则静默回退到 EZCONNECT 模式,SCAN 配置完全不加载
-
sqlnet.ora中需确保NAME.DIRECTORY_PATH = (TNSNAMES, EZCONNECT),否则可能跳过tnsnames.ora - 验证是否生效:在 Java 进程中打印
System.getenv("TNS_ADMIN"),并确认该路径下存在可读的tnsnames.ora
最容易被忽略的是 DNS 返回的三个 A 记录必须互不相同——/etc/hosts 里写三行相同 IP 是无效的,dig rac-scan.example.com A +short 必须输出三个独立 IPv4 地址。SCAN 域名解析失败或重复,会导致 srvctl start scan 静默失败,而 Java 应用只会表现出“连接总是打到同一个节点”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











