一、在上一节中提到了分库分表的策略。分库策略算法GroupIDAndCollectTimeDBShardingAlgorithm和分表策略算法CollectTimeYYYYMMDDTBShardingAlgorithm
分片策略算法有很多,但是一般的都是需要自定义,dangdangwang提供了最顶层的实现,但是具体的算法需要我们自己来写。
这里有两个自定义的算法,单分片算法和多分片算法,单分片算法是多分片算法的一种简单形式,所以完全可以用多分片算法代替单分片算法,下面两种形式是等价的。
newTableShardingStrategy("order_id",newSingleKeyShardingAlgorithm()))newTableShardingStrategy(Arrays.asList("order_id"),newMultiKeyShardingAlgorithm()))
同时在算法内部,dosharding等方法的shardingvalue入参根据使用算法类型不同而不同,单分片算法方public String doEqualSharding(final Collection<String> dataSourceNames,final ShardingValue<Integer> shardingValue)
多分片算法public Collection<String>doSharding(final Collection<String> availableTargetNames,final Collection<ShardingValue<?>> shardingValues)
根据数据源策略和表策略,单分片与多分片,这两种组合一共产生了4中可供实现的分片算法的接
- 单分片键数据源分片算法
SingleKeyDatabaseShardingAlgorithm
- 单分片表分片算法
SingleKeyTableShardingAlgorithm
- 多分片键数据源分片算法
MultipleKeyDatabaseShardingAlgorithm
- 多分片表分片算法
MultipleKeyTableShardingAlgorithm
单分片建算法需要实现三个方法,下面以单分片建数据源分片算法举例:
@Override public String doEqualSharding(final Collection<String> availableTargetNames,final ShardingValue<Integer> shardingValue) @Override public Collection<String>doInSharding(final Collection<String> availableTargetNames,final ShardingValue<Integer> shardingValue) @Override public Collection<String>doBetweenSharding(final Collection<String> availableTargetNames,final ShardingValue<Integer> shardingValue)
这三种算法作用如下 - doEqualSharding
在WHERE使用=
作为条件分片键。算法中使用shardingValue.getValue()
获取等=
后的值 -doInSharding
在WHERE使用IN
作为条件分片键。算法中使用shardingValue.getValues()
获取IN
后的值 - doBetweenSharding
在WHERE使用BETWEEN
作为条件分片键。算法中使用shardingValue.getValueRange()
获取BETWEEN
后的值
多分片建算法适用于比较复杂的场景,为了提高灵活性故只提供了一个方法实现
public Collection<String>doSharding(final Collection<String> availableTargetNames,final Collection<ShardingValue<?>> shardingValues)
算法实现的时候根据shardingValue.getType来获取条件是= .IN还是between
举个例:
db0 ├── t_order_00 user_id以a偶数 order_id为偶数 ├── t_order_01 user_id以a偶数 order_id为奇数 ├── t_order_10 user_id以b奇数 order_id为偶数 └── t_order_11 user_id以b奇数 order_id为奇数
public final class MultipleKeysModuloTableShardingAlgorithm implements MultipleKeysTableShardingAlgorithm { @Override public Collection<String> doSharding(final Collection<String> availableTargetNames, final Collection<ShardingValue<?>> shardingValues) { Set<Integer> orderIdValueSet = getShardingValue(shardingValues, "order_id"); Set<Integer> userIdValueSet = getShardingValue(shardingValues, "user_id"); List<String> result = new ArrayList<>(); /* userIdValueSet[10,11] + orderIdValueSet[101,102] => valueResult[[10,101],[10,102],[11,101],[11,102]] */ Set<List<Integer>> valueResult = Sets.cartesianProduct(userIdValueSet, orderIdValueSet); for (List<Integer> value : valueResult) { String suffix = Joiner.on("").join(value.get(0) % 2, value.get(1) % 2); for (String tableName : availableTargetNames) { if (tableName.endsWith(suffix)) { result.add(tableName); } } } return result; } private Set<Integer> getShardingValue(final Collection<ShardingValue<?>> shardingValues, final String shardingKey) { Set<Integer> valueSet = new HashSet<>(); ShardingValue<Integer> shardingValue = null; for (ShardingValue<?> each : shardingValues) { if (each.getColumnName().equals(shardingKey)) { shardingValue = (ShardingValue<Integer>) each; break; } } if (null == shardingValue) { return valueSet; } switch (shardingValue.getType()) { case SINGLE: valueSet.add(shardingValue.getValue()); break; case LIST: valueSet.addAll(shardingValue.getValues()); break; case RANGE: for (Integer i = shardingValue.getValueRange().lowerEndpoint(); i <= shardingValue.getValueRange().upperEndpoint(); i++) { valueSet.add(i); } break; default: throw new UnsupportedOperationException(); } return valueSet; } }
相关推荐
Sharding-JDBC通过规则配置,可以根据特定的分片策略(如取模、范围等)将数据分布到不同的数据库和表上,达到数据分散的效果。 3. **Sharding-JDBC的集成步骤** - 引入库:在项目中添加Sharding-JDBC的Maven或...
3. **分片策略多样化**:支持等号、between、in等多种分片条件,同时也支持多分片键,可以根据不同的业务需求灵活配置分片策略。 4. **强大的SQL解析能力**:除了基本的增删改查外,还支持复杂的SQL操作,例如聚合...
2. **配置ShardingRule**:在`application.properties`或`application.yml`中配置数据分片规则,包括分片策略(如按照日期、ID范围等)、分片键、数据源信息等。 3. **定义数据源**:配置数据源,可以是单个数据库...
这个简单的demo包含了设置分片策略、配置Sharding-JDBC规则、以及实际的数据库操作,开发者可以根据自己的业务需求对其进行调整。 在【标签】"sharding-jdbc shariding-jd"中,虽然"sharinding-jd"可能是"sharding-...
Sharding-JDBC支持基于业务规则的动态分片策略,可以根据特定字段的值自动将数据分布到不同的数据库或表中。 【压缩包子文件的文件名称列表】"sharding-jdbc-boot-demo-master" 暗示这是一个Git仓库的主分支,包含...
7. **实战解析**:在“sharding-jdbc-demo”中,我们可以通过查看源码理解如何配置Sharding-JDBC、定义分片策略、编写业务代码来调用分片API以及测试分片功能是否正常工作。 通过学习这个示例,开发者可以了解到...
3. 分片策略调整:随着业务发展,可能需要动态调整分片策略,因此设计时要考虑其灵活性。 总结,SpringBoot2.x结合Sharding-JDBC为Java开发者提供了一种高效且易于实现的数据库分片方案,通过简单的配置和编码,...
5. **实例源码分析**:源码中可能包含了Sharding-JDBC的启动配置、数据源配置、分片策略定义、SQL路由逻辑、以及MyBatis的相关配置。通过阅读源码,可以理解Sharding-JDBC是如何在实际应用中处理分库分表的SQL执行...
Sharding-JDBC支持基于范围、哈希等策略的分片规则。 3. **读写分离**:Sharding-JDBC允许设置主库和从库,自动路由读请求到从库,写请求到主库,以提高系统性能,减轻主库压力。 4. **Mybatis**:Mybatis是一个...
1. **配置Sharding-JDBC**: 首先,需要在项目的配置文件中设置Sharding-JDBC的规则,包括分片策略(例如按照日期、用户ID等进行分表)、数据库和表的别名等。 2. **MyBatis集成**: 在MyBatis的配置中,需要将数据源...
在使用Sharding-JDBC时,你需要配置分片规则,包括分片键(用于决定数据分布的字段)、分片策略(如取模分片、范围分片等)以及数据库和表的切分规则。例如,你可以基于用户ID进行取模分片,确保每个用户的数据只...
Sharding-JDBC作为一个客户端的透明化数据分片解决方案,它通过在应用程序与数据库之间添加一个JDBC驱动层,使得应用无需感知底层数据分片的具体细节,即可实现数据的分库分表以及读写分离。下面,我们逐步解析如何...
3. 创建Sharding-JDBC的配置类,定义分片策略,比如按照时间、ID等进行分片,并指定数据源。 4. 集成MyBatis,配置MyBatis的Mapper接口和XML映射文件,编写SQL语句。 5. 在SpringBoot启动类中,启用Sharding-JDBC和...
分片规则配置是Sharding-JDBC的核心,它定义了数据分片的策略。JDBC规范重写是指Sharding-JDBC在内部实现上,对JDBC规范进行了一些必要的调整,以适应分库分表的需求。SQL解析是指在SQL语句到达数据库之前,Sharding...
然后定义分片策略,比如按照时间、用户ID等字段进行分库分表。接着,在MyBatis的Mapper接口中,使用Sharding-JDBC提供的注解或API指定SQL的分片条件。最后,通过Spring的IoC容器获取并使用这些组件进行数据库操作。 ...
分库分表的概念、垂直拆分与水平拆分、分片策略和分片算法是Sharding-JDBC中核心的知识点,下面将对这些概念进行详细的解释。 ### 分库分表概念 分库分表是为了解决随着业务数据量的不断增长,单库单表模式面临的...
1. **数据分片**:将一个大表分成多个小表,分布在不同的数据库或表空间中,每个分片都有独立的主键范围,通过分片策略将SQL语句路由到合适的分片上执行。 2. **分片策略**:定义如何将数据分配到不同的分片上。...
<bean id="shardingDataSource" class="org.apache.shardingsphere.shardingjdbc.spring.boot.jta.datasource.SpringBootJtaShardingDataSource"> <property name="location" value="classpath:sharding-...
Sharding-JDBC提供了丰富的功能来应对这些挑战,如基于主键的分片策略、广播表、绑定表、自定义分片策略等。通过深入理解Sharding-JDBC的原理和使用方式,我们可以更好地利用这个工具提升系统的扩展性和性能。 最后...
Sharding-JDBC提供了多种数据分片策略,包括哈希分片、范围分片和精确分片。哈希分片基于数据的哈希值进行分配,适用于均匀分布的数据;范围分片根据数据的某个字段范围进行分片,适合有序增长的数据;精确分片则...