一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何配置.NET应用程序来支持Oracle Data Guard的快速应用通知?

时间:2026-07-15 19:57:57 编辑:袖梨 来源:一聚教程网

ODP.NET必须显式配置Failover=true才启用TAF,仅tnsnames.ora中配置FAILOVER_MODE或FAILOVER=YES无效;同时需满足LOAD_BALANCE=YES、驱动版本≥12.1、服务端启用专用监听器并注册TAF服务。

Failover=true 必须显式写在连接字符串里

odp.net 默认完全不启用故障转移,哪怕 tnsnames.ora 里配了 failover_modefailover=yes,也无效。必须在 .net 连接字符串中加 failover=true(注意大小写,不是 failover=truefailover=true)。

常见错误:只改了 tnsnames.ora,没动连接字符串,结果主库宕机后应用直接报 ORA-12154 或卡住不动;或者写了 Failover=True(首字母大写但其余小写),驱动不识别,等同于没开。

  • Failover=true 是 ODP.NET 的硬性开关,没有它,TAF(Transparent Application Failover)根本不会启动
  • Entity Framework 用户需检查 app.configweb.config 中的 connectionStrings,确保该参数存在且拼写准确
  • 若用 OracleConnectionStringBuilder 动态构造连接串,务必调用 builder["Failover"] = "true",不能漏掉

tnsnames.ora 中 LOAD_BALANCE 和 FAILOVER 必须共存

只写 LOAD_BALANCE=YES 不等于故障转移——它只影响首次建连时随机选地址;一旦连上,后续所有请求都死绑该实例,主库挂了也不会自动切。

真正触发连接时故障转移(connect-time failover),必须同时存在 LOAD_BALANCE=YESFAILOVER=YES,缺一不可。

  • 错误配置:(ADDRESS_LIST = (ADDRESS=...) (ADDRESS=...) (LOAD_BALANCE=YES)) → 无故障转移能力
  • 正确配置:(ADDRESS_LIST = (ADDRESS=...) (ADDRESS=...) (LOAD_BALANCE=YES) (FAILOVER=YES))
  • 若主库监听进程还在但数据库已 hang(比如 PMON 挂了),Oracle Net 可能无法快速判定失败,超时由 SQLNET.OUTBOUND_CONNECT_TIMEOUT 控制,默认 60 秒,建议设为 10 缩短感知延迟

TAF 类型决定查询是否重跑

连接成功后发生的故障(如主库运行中突然宕机),能否让正在执行的 SELECT 自动续跑,取决于 TAF 配置中的 TYPE 值和 ODP.NET 版本。

旧版 ODP.NET(如 11.2)只支持 TYPE=SESSION,即断开后重建连接,原有查询结果丢失;只有 12.1+ 才支持 TYPE=SELECT 的透明重执行。

  • FAILOVER_MODE = (TYPE = SELECT) 要求服务端也启用 TAF(ALTER SYSTEM REGISTER 后确认监听器注册了服务)
  • 服务端未启用 TAF 时,即使客户端写了 TYPE=SELECT,实际降级为 SESSION 行为
  • SELECT * FROM V$ACTIVE_SERVICES 查服务是否带 FAILOVER_TYPEFAILOVER_METHOD 字段,有值才表示 TAF 已生效

监听器必须用专用 SERVER,禁用 Shared Server

Data Guard 场景下,必须使用专用服务器连接(Dedicated Server)。Shared Server(MTS)与 TAF 不兼容,会导致故障转移后连接卡死或报 ORA-12514

检查方式:连接后查 SELECT server FROM v$session WHERE sid = SYS_CONTEXT('USERENV','SID'),返回 DEDICATED 才安全。

  • 监听器配置中不能含 DISPATCHERS 参数,否则默认启 Shared Server
  • 数据库参数 shared_servers 应设为 0,并确认 local_listener 指向的是专用监听器(如 LISTENER_DG
  • 应用连接字符串里不要加 Server=Shared 或类似干扰项

实际生效的关键点很窄:tnsnames.oraFAILOVER=YES + LOAD_BALANCE=YES + FAILOVER_MODE 配置,.NET 连接串里 Failover=true,驱动版本 ≥12.1,服务端监听器是专用模式且注册了 TAF 服务——这五项缺一不可。少一个,故障转移就变成半截子工程。

热门栏目