
# 数据库代理最佳实践
#### 使用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"**），确保部分连接超时断开时不会被继续使用。
![](https://support.huaweicloud.com/usermanual-rds-mysql/zh-cn_image_0000002212063692.png)
#### 读请求路由到主实例的场景
1. 如果查询语句被放在事务中，事务请求都会路由到主实例，若在查询语句前设置**set** **autocommit=0**也会被当做事务处理路由到主实例。
2. 如果无只读实例或所有只读节点均异常、只读节点权重为0时，则查询会路由到主实例。对于成功开启读写分离功能的实例，您可以设置其主实例和只读实例的权重。具体操作请参见[设置延时阈值和路由模式](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0018.html)。
3. 如果执行了Multi-Statements（如"**insert \*\*\*;select \*\*\***")，当前连接的后续请求会全部路由到主节点，需断开当前连接并重新连接才能恢复读写分离。
4. 带锁的读操作（如**SELECT for UPDATE**）会被路由到主节点。
5. 当使用**/\*FORCE_MASTER\*/** 这个**Hint**语句时，会被路由到主实例。
 
