更新时间:2025-08-13 gmt 08:00

数据库代理最佳实践-j9九游会登录

使用hint语法实现rds for mysql读写分离

在读写分离权重分配体系之外,hint可以作为另外一种sql补充语法来指定相关sql到主节点或只读节点执行。

  • hint注释仅作为路由建议,非只读sql、事务中的场景不能强制路由到只读节点。
  • 使用mysql命令行进行连接并使用hint语句时,需要在命令中增加-c选项,否则hint会被mysql命令行工具过滤。

可以在sql开头添加hint注释进行强制路由。

  • /*force_master*/强制路由到主节点。/*force_master*/只能在可读可写的地址上生效,对于只读地址即使使用/*force_master*/也不会路由到主节点。
  • /*force_slave*/强制路由到只读节点。

例如:select * from table1默认会路由到只读节点,如果改为/*force_master*/ select * from table1就会路由到主节点。

连接池设置

使用连接池时,需要设置连接探活机制(如jdbc连接池和druid连接池设置testonborrow=true,hikaricp连接池设置connectiontestquery="select 1"),确保部分连接超时断开时不会被继续使用。

读请求路由到主实例的场景

  1. 如果查询语句被放在事务中,事务请求都会路由到主实例,若在查询语句前设置set autocommit=0也会被当做事务处理路由到主实例。
  2. 如果无只读实例或所有只读节点均异常、只读节点权重为0时,则查询会路由到主实例。对于成功开启读写分离功能的实例,您可以设置其主实例和只读实例的权重。具体操作请参见设置延时阈值和路由模式
  3. 如果执行了multi-statements(如“insert ***;select ***”),当前连接的后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。
  4. 带锁的读操作(如select for update)会被路由到主节点。
  5. 当使用/*force_master*/这个hint语句时,会被路由到主实例。

相关文档

网站地图