想着可能要本地编译打包,所以就换成了3.0.0.M1版本,编译通过。
因为是本机测试,所以在本地配置mysql数据库。
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、除此以外还要一些类似"逻辑表"这样的概念,可以到官方文档自行查询。