赞
踩
在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);
设置了分库属性以及分库算法的类型,作为分库算法的配置。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。