SHARDING读写分离及精确分表遇到的坑

			网上看了很多都没有精确分表的  分享给大家
			首先先贴出来之前只分表用到的包  下面会贴代码
				<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;
	}

最后再次提醒大家 精确分表 每个表必须有分表的字段 查询和插入等操作也必须传值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值