sharding_hint

叶景龙
2023-12-01

获取所有表分布

TableRule tableRule = ShardingDataSource…getRuntimeContext().getRule()…getTableRule(logicTableName)

public Map<String, Set<String>> getDistTopology(final String logicTableName)
	if (dataSource instanceof ShardingDataSource) {
	      Map<String, Set<String>> result = new HashMap<String,Set<String>>();
	      ShardingRule shardingRule = ((ShardingDataSource) dataSource).getRuntimeContext().getRule();
	      TableRule tableRule = shardingRule.getTableRule(logicTableName);
	      List<DataNode> list =  tableRule.getActualDataNodes();
	
	      for (DataNode node : list ){
	          if (result.containsKey(node.getDataSourceName())){
	              Set<String> tableSet = result.get(node.getDataSourceName());
	              tableSet.add(node.getTableName());
	          } else {
	              Set<String> tableSet = new HashSet<>();
	              tableSet.add(node.getTableName());
	              result.put(node.getDataSourceName(),tableSet);
	          }
	      }
	      return result;
	} else {
	    return new HashMap<>();
	}
}

最终获得的结果为:
{ds_1=[t_order_0, t_order_1], ds_0=[t_order_0, t_order_1]}

hint的使用

指定库表

HintManager instance = HintManager.getInstance();
instance.addDatabaseShardingValue(logicTable,new HintComparavleValue(physicalDb));
instance.addTableShardingValue(logicTable,new HintComparavleValue(physicalTable));
//eg
instance.addDatabaseShardingValue("t_order",new HintComparavleValue("ds_1"));
instance.addDatabaseShardingValue("t_order",new HintComparavleValue("t_order_0"));

//还有另一种写法
hintManager.setDatabaseShardingValue(3);

真正的一个t_order使用hint的例子

HintManager hintManager = HintManager.getInstance();
hintManager.addDatabaseShardingValue("t_order",new HintComparavleValue("ds_1"));
hintManager.addTableShardingValue("t_order",new HintComparavleValue("t_order_0"));
try (Connection conn = dalDataSource.getConnection();
	Statement statement = conn.createStatement();
	ResultSet rs = statement.executeQuery("select * from t_order")){
	//查看日志判断是否走指定库表
  System.out.println(rs.next());

} catch (Exception e) {
    e.printStackTrace();
} finally {
    hintManager.clearHint();
}

清理hint线程变量

HintManager.clear();

 类似资料:

相关阅读

相关文章

相关问答