ODP.NET必须显式配置Failover=true才启用TAF,仅tnsnames.ora中配置FAILOVER_MODE或FAILOVER=YES无效;同时需满足LOAD_BALANCE=YES、驱动版本≥12.1、服务端启用专用监听器并注册TAF服务。
odp.net 默认完全不启用故障转移,哪怕 tnsnames.ora 里配了 failover_mode、failover=yes,也无效。必须在 .net 连接字符串中加 failover=true(注意大小写,不是 failover=true 或 failover=true)。
常见错误:只改了 tnsnames.ora,没动连接字符串,结果主库宕机后应用直接报 ORA-12154 或卡住不动;或者写了 Failover=True(首字母大写但其余小写),驱动不识别,等同于没开。
Failover=true 是 ODP.NET 的硬性开关,没有它,TAF(Transparent Application Failover)根本不会启动app.config 或 web.config 中的 connectionStrings,确保该参数存在且拼写准确OracleConnectionStringBuilder 动态构造连接串,务必调用 builder["Failover"] = "true",不能漏掉只写 LOAD_BALANCE=YES 不等于故障转移——它只影响首次建连时随机选地址;一旦连上,后续所有请求都死绑该实例,主库挂了也不会自动切。
真正触发连接时故障转移(connect-time failover),必须同时存在 LOAD_BALANCE=YES 和 FAILOVER=YES,缺一不可。
(ADDRESS_LIST = (ADDRESS=...) (ADDRESS=...) (LOAD_BALANCE=YES)) → 无故障转移能力(ADDRESS_LIST = (ADDRESS=...) (ADDRESS=...) (LOAD_BALANCE=YES) (FAILOVER=YES))
SQLNET.OUTBOUND_CONNECT_TIMEOUT 控制,默认 60 秒,建议设为 10 缩短感知延迟连接成功后发生的故障(如主库运行中突然宕机),能否让正在执行的 SELECT 自动续跑,取决于 TAF 配置中的 TYPE 值和 ODP.NET 版本。
旧版 ODP.NET(如 11.2)只支持 TYPE=SESSION,即断开后重建连接,原有查询结果丢失;只有 12.1+ 才支持 TYPE=SELECT 的透明重执行。
FAILOVER_MODE = (TYPE = SELECT) 要求服务端也启用 TAF(ALTER SYSTEM REGISTER 后确认监听器注册了服务)TYPE=SELECT,实际降级为 SESSION 行为SELECT * FROM V$ACTIVE_SERVICES 查服务是否带 FAILOVER_TYPE 和 FAILOVER_METHOD 字段,有值才表示 TAF 已生效Data Guard 场景下,必须使用专用服务器连接(Dedicated Server)。Shared Server(MTS)与 TAF 不兼容,会导致故障转移后连接卡死或报 ORA-12514。
检查方式:连接后查 SELECT server FROM v$session WHERE sid = SYS_CONTEXT('USERENV','SID'),返回 DEDICATED 才安全。
DISPATCHERS 参数,否则默认启 Shared Servershared_servers 应设为 0,并确认 local_listener 指向的是专用监听器(如 LISTENER_DG)Server=Shared 或类似干扰项实际生效的关键点很窄:tnsnames.ora 里 FAILOVER=YES + LOAD_BALANCE=YES + FAILOVER_MODE 配置,.NET 连接串里 Failover=true,驱动版本 ≥12.1,服务端监听器是专用模式且注册了 TAF 服务——这五项缺一不可。少一个,故障转移就变成半截子工程。