TAF自动故障转移需严格配置FAILOVER_MODE嵌套在CONNECT_DATA下,配对TYPE/METHOD,ADDRESS_LIST中SCAN地址须置首,Java应用必须用TNS别名且设置TNS_ADMIN。
taf 不是加个 failover=on 就能自动切走的,tnsnames.ora 里漏掉 failover_mode 块、或位置写错、或 type/method 配错,连接照样报 ora-03113,根本不会触发转移。
FAILOVER_MODE 必须嵌套在 CONNECT_DATA 下,不能放错位置
Oracle Net 只认一种结构:FAILOVER_MODE 必须作为 CONNECT_DATA 的直接子项,其他任何位置都静默失效。
- ✅ 正确写法:
(CONNECT_DATA = (SERVICE_NAME = orcl) (FAILOVER_MODE = (TYPE = SESSION) (METHOD = BASIC))) - ❌ 错误写法:把
FAILOVER_MODE放在DESCRIPTION顶层、或塞进ADDRESS_LIST、或写成独立块——驱动完全不解析 - Java 应用尤其容易踩坑:如果 JDBC URL 用的是 Easy Connect(如
jdbc:oracle:thin:@//rac1:1521/orcl),FAILOVER_MODE直接被忽略,TAF 彻底不启动
TYPE 和 METHOD 必须配对选对,否则行为和预期严重不符
TYPE 决定“故障后做什么”,METHOD 决定“什么时候做”,两者不匹配会导致会话中断、查询失败、或连接池爆满。
-
TYPE = SESSION+METHOD = BASIC:最常用组合。实例宕机后重建新会话,事务需重发,SELECT 语句会自动重执行。适合增删改类业务 -
TYPE = SELECT+METHOD = BASIC:仅对打开的游标有效,要求 JDBC 使用ResultSet.HOLD_CURSORS_OVER_COMMIT,且驱动必须是 ojdbc8+;普通应用不配游标支持时,照样抛ORA-03113 -
METHOD = PRECONNECT:启动时就为每个 ADDRESS 建连接,切换快但资源开销大;HikariCP 等连接池容易因重复建连触发ORA-12519,不建议 Java 应用默认启用
RETRIES 和 DELAY 要算清楚,别让应用卡死五分钟
TAF 故障转移耗时 = RETRIES × DELAY 秒。这个乘积不是越大越好,而是要匹配业务超时阈值。
- 设
RETRIES=180,DELAY=5→ 最长等 15 分钟才放弃,但多数 HTTP 接口超时才 30 秒,早返回 504 了 - 设
DELAY=1且RETRIES过大 → 连续重试可能被监听器限流,报ORA-12535 - 推荐起步值:
RETRIES=3,DELAY=5→ 最多等 15 秒,兼顾感知速度与稳定性 - 注意:
RETRIES=0表示不重试,首次失败立即报错;不设该参数则用默认值 5
ADDRESS_LIST 顺序决定 failover 路径,SCAN 地址必须放第一个
TAF 不做健康检查,也不轮询,它严格按 ADDRESS_LIST 中 ADDRESS 的书写顺序尝试连接——第一个通就用,挂了才试下一个。
- SCAN 地址(如
rac-scan.example.com)必须放在第一个ADDRESS,否则 Oracle Net 解析不到后续节点 VIP,整个 failover 链路失效 - 每个
ADDRESS必须独立写全:(PROTOCOL=TCP)(HOST=...)(PORT=...),不能合并 host 列表或复用 PORT - 跨机房部署时,同城节点地址必须前置,否则故障后可能先切到延迟 50ms 的异地节点,再卡顿 15 秒才回退
- 如果同时启用了
LOAD_BALANCE=ON,它只对同一ADDRESS_LIST内的多个ADDRESS生效,且仅影响新连接建立,不影响已建立连接的故障转移路径
最容易被忽略的点:Java 应用必须确保 TNS_ADMIN 环境变量指向含正确 tnsnames.ora 的目录,且 JDBC URL 必须用别名(如 jdbc:oracle:thin:@RAC),而不是 IP 或 Easy Connect 格式——否则所有配置都是白搭。











