Application Continuity(AC)在Oracle 19c RAC中必须协同TAF、FCF、FAN三者才能生效,仅设AC=ON无效;FAILOVER_MODE须置于CONNECT_DATA内,驱动须为ojdbc8且启用-Doracle.jdbc.ac=true,ONS/FAN配置到位并验证日志含“AC replay started”和“FCF event received”。

Application Continuity(AC)在Oracle 19c RAC中不能只靠AC=ON就生效,它必须和TAF、FCF、FAN三者协同工作,缺一不可;否则连接中断时仍会抛出ORA-03113或ORA-01033,事务不会重放。
tnsnames.ora里AC=ON只是个“开关”,但真正起作用靠TAF配置
很多人只加了(AC=ON),却漏掉最关键的FAILOVER_MODE嵌套位置。这个参数必须放在CONNECT_DATA块内,不是DESCRIPTION顶层——放错位置会导致AC静默失效,日志里完全看不到重放痕迹。
-
FAILOVER_TYPE=TRANSACTION:启用事务级重放(AC核心) -
FAILOVER_METHOD=BASIC:配合FCF使用,不能用PRECONNECT -
RETRY_COUNT=20、RETRY_DELAY=3:建议显式设置,避免默认值过短导致重试失败 - 错误写法:
(DESCRIPTION=(AC=ON)(FAILOVER_MODE=(...))...)→ 无效 - 正确写法:
(CONNECT_DATA=(SERVICE_NAME=myservice)(AC=ON)(FAILOVER_MODE=(TYPE=TRANSACTION)(METHOD=BASIC)(RETRY_COUNT=20)(RETRY_DELAY=3)))
FCF必须在连接池侧显式启用,不是数据库端配完就完事
WebLogic、UCP这类连接池不默认开启FCF,即使tnsnames.ora和ONS都对,连接池也感知不到节点故障,自然不会触发AC重放。
- WebLogic:控制台里必须勾选
Fast Connection Failover Enabled,且数据源JNDI绑定的驱动类要是oracle.jdbc.pool.OracleDataSource - UCP:代码中必须调用
setFastConnectionFailoverEnabled(true),不能只依赖connectionFactoryClassName=oracle.ucp.jdbc.PoolDataSourceFactory - 验证方式:应用启动后查日志,应出现
FCF event received for service字样;没有则说明FCF未生效
驱动版本和数据库版本不匹配,AC会“假装工作”但实际降级为TAF
ojdbc6、ojdbc7连19c数据库时,AC=ON会被忽略,事务中断后只做SELECT重放(即TAF行为),INSERT/UPDATE/DELETE直接失败——而驱动不会报错,也不会打任何警告日志,这是最危险的情况。
- 必须用
ojdbc8.jar(对应Java 8+),且数据库端v$parameter中application_continuity值为TRUE - 检查驱动是否真支持AC:
java -cp ojdbc8.jar oracle.jdbc.driver.OracleDriver,输出里要有Application Continuity关键词 - JVM启动参数要加
-Doracle.jdbc.ac=true,某些旧版ojdbc8默认关闭AC - AC重放日志关键字是
AC replay started,没看到就等于没跑起来
FAN和ONS配置不到位,AC连“故障通知”都收不到
AC依赖FAN事件驱动整个重放流程。如果ONS没通,或者客户端解析不了SCAN VIP,FCF收不到通知,后续所有环节都卡死。
- 所有RAC节点的
$ORACLE_HOME/opmn/conf/ons.conf里remoteport必须指向集群SCAN地址,例如remoteport=6200,且remoteNodes配成rac-scan:6200 - 客户端机器
/etc/hosts或DNS必须能解析rac-scan到SCAN VIP,ping rac-scan和telnet rac-scan 6200都要通 - ONS服务本身要运行:
crsctl stat res -t | grep ons应显示ONLINE - 数据库服务必须是用户自定义服务(非默认
orcl),并启用ENABLE=AQ,HA,APPS(即包含FAN)
AC不是开个开关就能自动兜底的机制,它是一条由FAN通知→FCF重建连接→TAF接管会话→AC重放事务组成的严格链路。任何一个环节配置偏差(比如ONS端口写错、FAILOVER_MODE放错层级、驱动版本不对),都会让整条链路断裂,而错误表现常常只是“连接断了”,根本看不出AC参与过。调试时优先确认AC replay started和FCF event received这两条日志是否真实出现,比反复检查tnsnames.ora语法更有效。











