java中fcf需ucp显式启用setfastconnectionfailoverenabled(true),依赖服务端fan、ons连通及精确service名匹配,缺一不可;easy connect格式不支持,须用scan vip或tnsnames别名,且禁用failover_mode。

Java 本身不触发 FCF,只消费 FAN 事件;必须用 UCP + 显式启用 + 正确 service 配置,缺一不可。
FCF 不是连接池自动开启的功能
UCP 的 setFastConnectionFailoverEnabled(true) 必须在 PoolDataSource 初始化后立即调用,不能靠连接属性或 URL 参数替代。JDBC 层的 oracle.jdbc.fanEnabled=true 或 setFailoverEnabled(true) 在 ojdbc8+ 中已废弃,调用后静默失效。
- Spring Boot 用户需在
@PostConstruct或InitializingBean.afterPropertiesSet()中显式调用该方法 - 若用 HikariCP,它根本不支持 FCF —— 换 UCP 是硬性前提
- FCF 依赖服务端 FAN 事件推送,不是轮询或重试逻辑,没开就完全收不到故障通知
服务端配置和客户端连通性是前提
FCF 生效的前提是服务端已启用 FAN,并且 ONS(Oracle Notification Service)通道可达。否则 UCP 即使开了开关,也永远等不到事件。
- 确认 service 已用
srvctl add service -s mysvc -r "inst1,inst2" -f注册,且srvctl config service显示FAILOVER_TYPE=SELECT - 执行
onsctl ping -h rac1-vip -p 6200验证 ONS 连通性;不通则 FCF 彻底失效 - tnsnames.ora 中禁止出现
FAILOVER_MODE或FAILOVER=ON—— FCF 和 TAF 的重试机制互斥,共存会导致连接卡死在下线节点
JDBC URL 和连接字符串写法必须合规
UCP 只在解析 SCAN 地址或 tnsnames 别名时才加载 FAN 相关逻辑。Easy Connect 格式(如 jdbc:oracle:thin:@//rac1:1521/mysvc)会跳过所有 FAN 初始化路径。
- 必须使用 SCAN VIP:例如
jdbc:oracle:thin:@myrac-scan:1521/mysvc - 或引用 tnsnames 别名:
jdbc:oracle:thin:@MYDB,并确保TNS_ADMIN环境变量指向含有效配置的目录 - URL 中不要加
?oracle.jdbc.fanEnabled=true,这个参数对 UCP 的 FCF 启用无任何作用
连接亲和性和故障转移不能混为一谈
FCF 负责快速清理失效连接、触发重建;但“把相同业务请求路由到同一实例”是连接亲和性(Connection Affinity),靠 connectionLabel 实现,和 FCF 完全正交。
- 误以为设置
setConnectionPoolName("fcf_pool")就能绑定实例 —— 实际无效 - 亲和性标签必须在每次
getConnection(Properties)时传入,例如props.put("affinity", "tenant-123") - FCF 清理连接后,新连接是否复用旧标签,取决于你是否在重连逻辑中重新传入相同
Properties
最容易被忽略的是:FCF 只管“断连即删”,不管“删完连哪”。新连接路由由负载均衡策略(如 SCAN 的 LBA)决定,不是 FCF 控制的。如果你依赖某次查询后的 session 级状态(比如临时表、包变量),必须配合亲和性 + 显式标签管理,否则切换后状态就丢了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











