1.分库
package com.hecr.algorithm;
import org.apache.shardingsphere.api.sharding.hint.HintShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.hint.HintShardingValue;
import java.util.ArrayList;
import java.util.Collection;
public class CustomDBHintShardingAlgorithm implements HintShardingAlgorithm<Long> {
@Override
public Collection<String> doSharding(Collection<String> dataSourceNames, HintShardingValue<Long> hintShardingValue) {
Collection<String> result = new ArrayList<>();
for (String tableName : dataSourceNames) {
for (Long shardingValue : hintShardingValue.getValues()) {
if (tableName.endsWith(String.valueOf(shardingValue % dataSourceNames.size()))) {
result.add(tableName);
}
}
}
return result;
}
}
2.分表
package com.hecr.algorithm;
import org.apache.shardingsphere.api.sharding.hint.HintShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.hint.HintShardingValue;
import java.util.ArrayList;
import java.util.Collection;
public class CustomTableHintShardingAlgorithm implements HintShardingAlgorithm<Long> {
@Override
public Collection<String>
doSharding(Collection<String> dataSourceNames, HintShardingValue<Long> hintShardingValue) {
Collection<String> result = new ArrayList<>();
for (String tableName : dataSourceNames) {
for (Long shardingValue : hintShardingValue.getValues()) {
if (tableName.endsWith(String.valueOf(shardingValue % dataSourceNames.size()))) {
result.add(tableName);
}
}
}
return result;
}
}
3.配置文件
# Hint分⽚算法
spring.shardingsphere.sharding.tables.product_order.table-strategy.hint.algorithm-class-name=com.hecr.algorithm.CustomTableHintShardingAlgorithm
spring.shardingsphere.sharding.tables.product_order.database-strategy.hint.algorithm-class-name=com.hecr.algorithm.CustomDBHintShardingAlgorithm
4.测试代码
@Test
public void testHint() {
// 清除掉历史的规则
HintManager.clear();
//Hint分⽚策略必须要使⽤ HintManager⼯具类之前没⽤partitionKey会触发全库表路由,发出很多不相⼲的SQL. 使⽤Hint⽅式是可以避免这个问题
HintManager hintManager = HintManager.getInstance();
// 设置库的分⽚健,value⽤于库分⽚取模,
hintManager.addDatabaseShardingValue("product_order", 3L);
// 设置表的分⽚健,value⽤于表分⽚取模,
//hintManager.addTableShardingValue("product_order",7L);
hintManager.addTableShardingValue("product_order", 8L);
// 如果在读写分离数据库中,Hint 可以强制读主库(主从复制存在⼀定延时,但在业务场景中,可能更需要保证数据的实时性)
//hintManager.setMasterRouteOnly();
//对应的value只做查询,不做sql解析
productOrderMapper.selectList(new QueryWrapper<ProductOrder>().eq("id", 66L));
}