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]}
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();
}
HintManager.clear();