shardingjdbc 5.x 实现 自定义分片策略(分库和分表)

在ShardingJdbc 5.x版本中,使用SPI方式进行分片策略的注入。

1. 编写分库策略

package com.demo.server.config;

import java.util.Collection;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class DatabaseShardingAlgorithm implements StandardShardingAlgorithm<String> {

	private Properties props;

	@Value("${sharding.dbshardcount}")
	private Long dbshardCount = 1l;

	public Properties getProps() {
		return props;
	}

	public void setProps(Properties props) {
		this.props = props;
	}

	@Override
	public String doSharding(Collection<String> databaseNames, PreciseShardingValue<String> shardingValue) {

		Long lShard = 0l;
		String value = shardingValue.getValue();
		String number = getNumber(value);
						
		// 字符串转换为数字
		lShard = Long.parseLong(number);
		
		// 取最低位
        // 这里假设分为10个库,0-9
		Long shardMod = lShard % 10;		

		for (String database : databaseNames) {
			if (database.endsWith(String.valueOf(shardMod))) {
				return database;
			}
		}

		return "";
	}

	@Override
	public String getType() {
		return "SHLD_DBSHARD";
	}

	@Override
	public void init() {
		// 这里可以进行必要的初始化

	}

	@Override
	public Collection<String> doSharding(Collection<String> availableTargetNames,
			RangeShardingValue<String> shardingValue) {
		// 这里可以定义范围分片策略
		return null;
	}

	String getNumber(String str) {
		// 只允数字
		String regEx = "[^0-9]";

		Pattern p = Pattern.compile(regEx);

		Matcher m = p.matcher(str);

		// 替换与模式匹配的所有字符(即非数字的字符将被"0"替换)
		return m.replaceAll("0").trim();

	}	
}

2. 在 resource 文件夹下创建 META-INF/services文件夹,并在该文件夹下创建文件名为org.apache.shardingsphere.sharding.spi.ShardingAlgorithm的文件,并在文件中写入分片策略类全路径名。

com.demo.server.config.DatabaseShardingAlgorithm

3.  在ShardingJdbcConfig中,配置分表算法时指定该分片策略名称以及分库策略的属性,该属性可以在分库策略中使用。

Properties pTable = new Properties();
pTable.setProperty("dbshardCount", String.valueOf(dbshardCount));

// 设置分库策略
ShardingSphereAlgorithmConfiguration ssacdb = new ShardingSphereAlgorithmConfiguration(
					"SHLD_DBSHARD", pTable);
shardingRuleConfiguration.getShardingAlgorithms().put("dbShardingAlgorithm", ssacdb);

设置了分库属性以及分库算法的类型,作为分库算法的配置。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值