预计5.2.1版本的SharedingSphere Hint指定数据库未生效问题
配置文件展示
shardingsphere:props:sql-show: falsedatasource:names:datacenter1,datacenter2,datacenter3rules:sharding:tables:shape:actual-data-nodes: datacenter$->{1..3}.shape$->{0..7}key-generate-strategy:column: idkey-generator-name: snowflaketable-strategy:hint:sharding-algorithm-name: myTest sharding-algorithms:myTest:type: CLASS_BASEprops:strategy: hintalgorithmClassName: com.config.CustomDataSourceSelector
com.config.CustomDataSourceSelector如下所示
public class CustomDataSourceSelector implements HintShardingAlgorithm<Integer> {@Overridepublic Collection<String> doSharding(Collection<String> availableTargetNames, HintShardingValue<Integer> shardingValue) {Collection<Integer> values = shardingValue.getValues();Collection<String> dbs= Lists.newArrayList();for(Integer one: values){availableTargetNames.forEach(db->{if(db.endsWith(one.toString())){dbs.add(db);}});}return dbs;}@Overridepublic Properties getProps() {return null;}@Overridepublic void init(Properties properties) {}
}
测试类:
@Test
public void test() {//创建HintManager示例HintManager hintManager = HintManager.getInstance();//配置分表路由//hintManager.addTableShardingValue("shape", 1);//配置分库路由hintManager.addDatabaseShardingValue("datacenter", 0);// sql查询数据库//关闭强制路由hintManager.close();
}
结果这里的sql查询并没有走datacenter0。经过排查,分库分表最终其实要落到表上,而配置文件中数据库的路由策略配置在逻辑表下,所以猜想用逻辑表名。(未读源码下的排查)
解决方式:
hintManager.addDatabaseShardingValue("shape", 0);
hintManager.addDatabaseShardingValue("shape", 0); 这里的还是得用逻辑表名才可以。