网上看了很多都没有精确分表的 分享给大家
首先先贴出来之前只分表用到的包 下面会贴代码
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>3.0.0.M3</version>
</dependency>
之前我自己负责的系统业务量不是太大只用到了分表 当时想做读写分离 想到了多数据源 mycat sharding等多种方法 在询问了公司DBA后 被告知 他们会PROXY 不用我们管分离 就没做
前段时间要重构别的系统 需要做读写分离加分表 把做的过程分享给大家
第一 我原来还是按照 starter包这种方式配在配置文件里的 但是呢会报读取不到URL这个错 很难搞 因为整个大的部门(新项目)要去把别的项目 都当做父级项目来引 而他引的包是sharding-jdbc-core包 导致一直配不好 然后又在官网学习了下发现core包 必须像配置多数据源那样 陪在项目里面
官网[添加链接描述](https://shardingsphere.apache.org/document/current/cn/manual/shardingsphere-jdbc/usage/orchestration/)
我试着按照core包的方式配置 觉得这个比在配置里面配要麻烦 个人感觉啊
然后去说服管理父级项目的人去改动一下这个包 别让我们下面的人 强依赖他这个包 过了一天发现变成和springboot-start包了 OK 又回到我熟悉的配置了 然后apollp配置会很麻烦 大家如果用的话建议先在本地配置
第二 springboot用的2.2的 mybatis-start是2.1.2 相关库也要让DBA同步好 之前开发库报版本问题 连接有问题
大家都注意好各依赖版本问题
第三 不要犯低级错误 我是用的精确分表 分公司编码org_code 在写demo的时候 把order_code看成分公司编码了 导致没走到 分表策略 走的全扫描 用了2个小时来看为什么
现在给大家贴一下4.0用到的各个包
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0</version>
</dependency>
springboot 上面也提到是2.2.0.RELEASE
配置
spring.shardingsphere.datasource.names = m0,s0
spring.shardingsphere.datasource.m0.type = com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.m0.driver-class-name = com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.m0.jdbc-Url =
spring.shardingsphere.datasource.m0.username =
spring.shardingsphere.datasource.m0.password =
spring.shardingsphere.datasource.s0.type = com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.s0.driver-class-name = com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.s0.jdbc-Url =
spring.shardingsphere.datasource.s0.username =
spring.shardingsphere.datasource.s0.password =
spring.shardingsphere.sharding.master-slave-rules.ds.masterDataSourceName = m0
spring.shardingsphere.sharding.master-slave-rules.ds.slaveDataSourceNames = s0
spring.shardingsphere.sharding.tables.t_table.actual-data-Nodes = ds.t_table${['表后缀','表后缀']}
spring.shardingsphere.sharding.tables.t_table.table-strategy.standard.sharding-column = org_code
spring.shardingsphere.sharding.tables.t_table.table-strategy.standard.precise-algorithm-class-name = 指向精确分片全类名
spring.shardingsphere.props.sql.show = true
精确分表算法如下
public class MyShardingConfig implements PreciseShardingAlgorithm<String> {
/**
* 精确分片算法,根据分公司code,选择表名后缀
*
* @param availableTargetNames
* @param shardingValue
* @return
*/
@Override
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {
if (shardingValue.getColumnName().equalsIgnoreCase("org_code")) {
String orgCode = shardingValue.getValue().toString();
String suffix = OrgCityCodeUtil.getCityCodeMap().get(orgCode);
return new StringBuffer(shardingValue.getLogicTableName()).append("_").append(suffix).toString();
//return shardingValue.getLogicTableName() + "_" + suffix;
}
return null;
}
}
OrgCityCodeUtil 按照实际分表字段的值来找对应的后缀
public static Map<String,String> getCityCodeMap() {
if (orgCodeMap == null) {
orgCodeMap = new HashMap<String,String>();
orgCodeMap.put("属性值", "表后缀");
orgCodeMap.put("属性值", "表后缀");
//
//
//
}
return orgCodeMap;
}
最后再次提醒大家 精确分表 每个表必须有分表的字段 查询和插入等操作也必须传值