mysql-connector-java 5.1.6中failOverReadOnly参数不生效问题咨询
MySQL故障转移后备用库无法执行写操作的原因及解决方案
核心原因
- 驱动版本存在已知bug:你使用的
mysql-connector-java 5.1.6版本存在故障转移逻辑缺陷,即使配置了failOverReadOnly=false参数,主库连接失败切换到备用节点时,驱动仍然会强制将备用连接标记为只读状态,该bug在5.1.7及之后的版本才被修复。 - JDBC URL格式错误:你配置的多主机URL中首个节点地址写为
dbt1:9999:3306,存在2个端口段不符合MySQL JDBC URL规范,驱动解析主库地址直接失败触发故障转移,同时触发上述驱动只读bug。 - 参数生效逻辑问题:5.1.6版本中
failOverReadOnly参数仅在主库恢复、连接切回主库时生效,切换到备用节点的场景下不会读取该参数配置。
解决方案
- 修正JDBC URL格式,将错误的多端口主节点地址改为规范的
host:port格式,测试故障转移时可直接将主节点端口改为不可用的端口即可,例如jdbc:mysql://dbt1:9999,dbt2:3306,dbt3:3306/rs01?autoReconnect=true&failOverReadOnly=false&secondsBeforeRetryMaster=60&queriesBeforeRetryMaster=10&useSSL=false。 - 升级
mysql-connector-java版本至5.1系列最新稳定版5.1.49,即可直接解决故障转移后强制只读的bug。 - 若暂时无法升级驱动,可在连接池配置中强制设置默认连接非只读,例如使用HikariCP时添加配置
spring.datasource.hikari.read-only=false,或者在业务代码获取连接后主动执行connection.setReadOnly(false);覆盖驱动的只读标记。
内容的提问来源于stack exchange,提问作者ShaggyInjun
相关产品推荐
相关产品推荐

