Apache ShardingSphere 使用 ThreadLocal 管理主库路由标记进行强制路由。 可以通过编程的方式向 HintManager 中添加主库路由标记,该值仅在当前线程内生效。 Apache ShardingSphere 还可以通过 SQL 中增加注释的方式进行主库路由。
Hint 在读写分离场景下,主要用于强制在主库进行某些数据操作。
HintManager.getInstance()
获取 HintManager 实例;HintManager.setWriteRouteOnly()
方法设置主库路由标记;HintManager.close()
清理 ThreadLocal 中的内容。与基于 Hint 的数据分片相同。
使用 hintManager.setWriteRouteOnly 设置主库路由。
与基于 Hint 的数据分片相同。
String sql = "SELECT * FROM t_order";
try (HintManager hintManager = HintManager.getInstance();
Connection conn = dataSource.getConnection();
PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
hintManager.setWriteRouteOnly();
try (ResultSet rs = preparedStatement.executeQuery()) {
while (rs.next()) {
// ... }
}
}
SQL Hint 功能的注释格式暂时只支持 /* */
,内容需要以 SHARDINGSPHERE_HINT:
开始,属性名为 WRITE_ROUTE_ONLY
。
/* SHARDINGSPHERE_HINT: WRITE_ROUTE_ONLY=true */
SELECT * FROM t_order;
与基于 Hint 的数据分片相同。
hintManager.setDataSourceName
设置数据库名称。String sql = "SELECT * FROM t_order";
try (HintManager hintManager = HintManager.getInstance();
Connection conn = dataSource.getConnection();
PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
hintManager.setDataSourceName("ds_0");
try (ResultSet rs = preparedStatement.executeQuery()) {
while (rs.next()) {
// ...
}
}
}
SQL Hint 功能目前只支持路由至一个数据源。 注释格式暂时只支持 /* */
,内容需要以 SHARDINGSPHERE_HINT:
开始,属性名为 DATA_SOURCE_NAME
。
如果使用 MySQL
客户端连接需要添加 -c
选项保留注释,客户端默认是 --skip-comments
过滤注释。
/* SHARDINGSPHERE_HINT: DATA_SOURCE_NAME=ds_0 */
SELECT * FROM t_order;