分库分表利器——sharding-sphere (2)

想着可能要本地编译打包,所以就换成了3.0.0.M1版本,编译通过。

分库分表利器——sharding-sphere

3、配置数据源

因为是本机测试,所以在本地配置mysql数据库。

分库分表利器——sharding-sphere

4、编写数据分片代码

sharding-sphere-example项目中有基于不同场景包括spring-boot、jpa、mybatis的具体分库分表的实例代码。

本文主要结合sharding-sphere官方文档给出的数据分片代码讲解如何实现分库分表的。

测试类ShardingDataSource(自建测试类,来源)

package practice; import io.shardingsphere.core.api.ShardingDataSourceFactory; import io.shardingsphere.core.api.config.ShardingRuleConfiguration; import io.shardingsphere.core.api.config.TableRuleConfiguration; import io.shardingsphere.core.api.config.strategy.InlineShardingStrategyConfiguration; import io.shardingsphere.example.jdbc.fixture.DataRepository; import org.apache.commons.dbcp.BasicDataSource; import javax.sql.DataSource; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; public class ShardingDataSource { public static void main(String[] args) throws SQLException { ShardingDataSource shardingDataSource = new ShardingDataSource(); DataSource dataSource = shardingDataSource.sharding(); new DataRepository(dataSource).demo(); } public DataSource sharding() throws SQLException { // 配置真实数据源 Map<String, DataSource> dataSourceMap = new HashMap<>(); // 配置第一个数据源 BasicDataSource dataSource1 = new BasicDataSource(); dataSource1.setDriverClassName("com.mysql.jdbc.Driver"); dataSource1.setUrl("jdbc:mysql://127.0.0.1:3306/ds0"); dataSource1.setUsername("root"); dataSource1.setPassword("root"); dataSourceMap.put("ds0", dataSource1); // 配置第二个数据源 BasicDataSource dataSource2 = new BasicDataSource(); dataSource2.setDriverClassName("com.mysql.jdbc.Driver"); dataSource2.setUrl("jdbc:mysql://127.0.0.1:3306/ds1"); dataSource2.setUsername("root"); dataSource2.setPassword("root"); dataSourceMap.put("ds1", dataSource2); // 配置Order表规则 TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration(); orderTableRuleConfig.setLogicTable("t_order"); orderTableRuleConfig.setActualDataNodes("ds${0..1}.t_order${0..1}"); // 配置分库 + 分表策略 orderTableRuleConfig.setDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("user_id", "ds${user_id % 2}")); orderTableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order${order_id % 2}")); orderTableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_item_id", "t_order_item${order_item_id % 2}")); // 配置分片规则 ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig); // 配置order_item表规则... TableRuleConfiguration orderItemTableRuleConfig = new TableRuleConfiguration(); orderItemTableRuleConfig.setLogicTable("t_order_item"); orderItemTableRuleConfig.setActualDataNodes("ds${0..1}.t_order_item${0..1}"); shardingRuleConfig.getTableRuleConfigs().add(orderItemTableRuleConfig); // 获取数据源对象 return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, new ConcurrentHashMap(), new Properties()); } }

注意

1、代码中类似"ds\({0..1}.t_order\){0..1}"成为行表达式,形如"\({ expression }或\)->{ expression }"。该表达式可用于配置数据节点和配置分片算法。

${begin..end}表示范围区间,即表示从begin到end个

${[unit1, unit2, unit_x]}表示枚举值

2、orderTableRuleConfig.setActualDataNodes("ds\({0..1}.t_order\){0..1}");

这里表示的是使用行表达式配置数据节点即数据库分别是ds0、ds1,表分别是t_order0、t_order1。

该表达的等价组合是:ds0.t_order0, ds0.t_order1, ds1.t_order0, ds1.t_order1。

3、orderTableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order${order_id % 2}"));

这里表示的是使用行表达式配置分片算法。该行表示针对t_order表中的元素按照order_id模2将不同的元素放进不同的表中。

比如order_id=5,5%2=1,则放入t_order1中

order_id=6, 6%2=0, 则放入t_order0中

4、除此以外还要一些类似"逻辑表"这样的概念,可以到官方文档自行查询。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpspzf.html