odp.net必须在连接字符串中显式设置failover=true(大小写敏感),否则即使tnsnames.ora中正确配置failover_mode,taf也不触发;failover_mode须嵌套在connect_data下,type=session+method=basic最稳妥,retries×delay建议设为3×5(15秒)。
必须在连接字符串中显式加 failover=true,否则即使 tnsnames.ora 里配全了 failover_mode,odp.net 也完全不触发 taf。
ODP.NET 连接字符串必须带 Failover=true
Oracle Data Provider for .NET 默认禁用 TAF,这是最常被忽略的开关。它和 tnsnames.ora 中的 FAILOVER=ON 或 FAILOVER_MODE 完全无关——后者只影响 Oracle Net 层的连接时故障转移(CTF),不是 TAF。
-
Failover=true是 ODP.NET 特有的连接字符串参数,大小写敏感;FAILOVER=TRUE或failover=yes都无效 - Entity Framework 用户需确认
app.config或web.config的<connectionstrings></connectionstrings>里该参数已存在,EF 不会自动注入 - 若用
OracleConnectionStringBuilder构造连接串,记得调用builder["Failover"] = "true",不能漏掉
tnsnames.ora 中 FAILOVER_MODE 必须嵌套在 CONNECT_DATA 下
TNS 解析器只认一种结构:FAILOVER_MODE 必须是 CONNECT_DATA 的直接子项,放错位置等于没配。
- ✅ 正确:
(CONNECT_DATA = (SERVICE_NAME = JED_RW) (FAILOVER_MODE = (TYPE = SELECT) (METHOD = BASIC) (RETRIES = 3) (DELAY = 5))) - ❌ 错误:把
FAILOVER_MODE写在DESCRIPTION顶层、塞进ADDRESS_LIST、或独立成块——Oracle Net 静默忽略 - Java 应用踩坑更常见:如果用 Easy Connect URL(如
jdbc:oracle:thin:@//rac1:1521/orcl),FAILOVER_MODE根本不生效,TAF 彻底失效
TYPE 和 METHOD 组合决定行为,别乱选
TYPE=SELECT 不是“升级版”,它依赖客户端游标保持能力;多数 .NET 应用默认不满足条件,强行配会导致 ORA-03113。
-
TYPE=SESSION+METHOD=BASIC:最稳妥组合。实例宕机后重建会话,事务回滚,SELECT需重发;适用于增删改类业务 -
TYPE=SELECT+METHOD=BASIC:仅对已打开的OracleCommand.ExecuteReader()游标有效,且要求驱动 ≥ 12.1、应用显式设置CommandBehavior.KeyInfo或保持连接未关闭;普通ExecuteScalar()或ExecuteNonQuery()不触发续跑 -
METHOD=PRECONNECT:启动时就为每个地址建连,资源开销大;.NET 连接池(如OracleConnection默认池)可能因并发建连触发ORA-12519,不建议生产环境启用
RETRIES × DELAY 决定故障感知延迟,别设成 300×10
TAF 故障转移耗时 ≈ RETRIES × DELAY 秒。这个值必须匹配上层业务超时,否则应用早返回 504,TAF 还在傻等。
- 推荐起点:
RETRIES=3、DELAY=5→ 最多等待 15 秒,兼顾稳定性与响应速度 -
RETRIES=0表示不重试,首次失败立即报错;不设该参数则用默认值 5 -
DELAY=1且RETRIES过大 → 可能被监听器限流,报ORA-12535;跨机房场景下,DELAY至少设为 3–5 秒
真正难的是游标续跑——TYPE=SELECT 要求从 OracleCommand 创建、执行、到结果读取全程可控,任何封装层(比如 Dapper 的 Query<t>()</t>)都可能破坏上下文,导致 TAF 退化为 SESSION 模式。











