在学习过ShardingSphere-JDBC相关的操作之后,现在使用其对数据库进行水平拆分。

1.环境准备

1.版本信息

mysql的版本:

[root@m161p114 sql]$ mysql -uroot -pmysql;
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 224
Server version: 5.7.34-log Source distribution

ShardingSphere gradle中的引入:

 implementation 'org.apache.shardingsphere:shardingsphere-jdbc-core-spring-boot-starter:5.0.0-alpha'

2.表结构

需要拆分的表结构如下:

/*
* 逻辑表
 */
drop table if exists `t_order_summary`;
create table t_order_summary  (
                                    order_id         	bigint  comment '订单id'  not null,
                                    order_no         	int(11) comment '订单编号'  not null,
                                    customer_id      	int(11) comment '下单用户id'  not null,
                                    payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                    order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                    payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                    consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                    consignee_address	varchar(100) comment '收货人详细'  not null,
                                    consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                    express_comp     	varchar(30) comment '快递公司名称'  not null,
                                    express_no       	varchar(50) comment '快递单号'  not null,
                                    create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                    is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                    update_time      	timestamp comment '最新更新时间'  not null,
                                    primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-逻辑表' ;

这是之前定义的订单表,之前order_id是采用的mysql的自增列。这个表的数据量非常大,现在要进行拆分。

2.数据库的水平拆分

现在规划将该数据库进行水平的分库分表,拆分到两个库中,每个库16张表。
创建数据库:

create database gts01 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
grant all privileges on gts01.* to gts@’%’;
flush privileges;
create database gts02 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
grant all privileges on gts02.* to gts@’%’;
flush privileges;

数据库gts01创建表:

use gts01;

drop table if exists `t_order_summary_1`;
create table t_order_summary_1  (
  order_id         	bigint  comment '订单id'  not null,
  order_no         	int(11) comment '订单编号'  not null,
  customer_id      	int(11) comment '下单用户id'  not null,
  payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
  order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
  payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
  consignee_name   	varchar(50) comment '收货人姓名'  not null,
  consignee_address	varchar(100) comment '收货人详细'  not null,
  consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
  express_comp     	varchar(30) comment '快递公司名称'  not null,
  express_no       	varchar(50) comment '快递单号'  not null,
  create_time      	timestamp comment '创建时间'  not null default current_timestamp,
  is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
  update_time      	timestamp comment '最新更新时间'  not null,
  primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表02' ;

drop table if exists `t_order_summary_2`;
create table t_order_summary_2  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表02' ;

drop table if exists `t_order_summary_3`;
create table t_order_summary_3  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表03' ;

drop table if exists `t_order_summary_4`;
create table t_order_summary_4  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表04' ;

drop table if exists `t_order_summary_5`;
create table t_order_summary_5  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表05' ;

drop table if exists `t_order_summary_6`;
create table t_order_summary_6  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表06' ;

drop table if exists `t_order_summary_7`;
create table t_order_summary_7  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表07' ;

drop table if exists `t_order_summary_8`;
create table t_order_summary_8  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表08' ;

drop table if exists `t_order_summary_9`;
create table t_order_summary_9  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表09' ;

drop table if exists `t_order_summary_10`;
create table t_order_summary_10  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表10' ;

drop table if exists `t_order_summary_11`;
create table t_order_summary_11  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表11' ;

drop table if exists `t_order_summary_12`;
create table t_order_summary_12  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表12' ;

drop table if exists `t_order_summary_13`;
create table t_order_summary_13  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表13' ;

drop table if exists `t_order_summary_14`;
create table t_order_summary_14  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表14' ;

drop table if exists `t_order_summary_15`;
create table t_order_summary_15  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表15' ;

drop table if exists `t_order_summary_16`;
create table t_order_summary_16  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表16' ;

数据库gts02创建表:

use gts02;

drop table if exists `t_order_summary_17`;
create table t_order_summary_17  (
  order_id         	bigint  comment '订单id'  not null,
  order_no         	int(11) comment '订单编号'  not null,
  customer_id      	int(11) comment '下单用户id'  not null,
  payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
  order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
  payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
  consignee_name   	varchar(50) comment '收货人姓名'  not null,
  consignee_address	varchar(100) comment '收货人详细'  not null,
  consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
  express_comp     	varchar(30) comment '快递公司名称'  not null,
  express_no       	varchar(50) comment '快递单号'  not null,
  create_time      	timestamp comment '创建时间'  not null default current_timestamp,
  is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
  update_time      	timestamp comment '最新更新时间'  not null,
  primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表17' ;

drop table if exists `t_order_summary_18`;
create table t_order_summary_18  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表18' ;

drop table if exists `t_order_summary_19`;
create table t_order_summary_19  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表19' ;

drop table if exists `t_order_summary_20`;
create table t_order_summary_20  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表20' ;

drop table if exists `t_order_summary_21`;
create table t_order_summary_21  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表21' ;

drop table if exists `t_order_summary_22`;
create table t_order_summary_22  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表22' ;

drop table if exists `t_order_summary_23`;
create table t_order_summary_23  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表23' ;

drop table if exists `t_order_summary_24`;
create table t_order_summary_24  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表24' ;

drop table if exists `t_order_summary_25`;
create table t_order_summary_25  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表25' ;

drop table if exists `t_order_summary_26`;
create table t_order_summary_26  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表26' ;

drop table if exists `t_order_summary_27`;
create table t_order_summary_27  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表27' ;

drop table if exists `t_order_summary_28`;
create table t_order_summary_28  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表28' ;

drop table if exists `t_order_summary_29`;
create table t_order_summary_29  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表29' ;

drop table if exists `t_order_summary_30`;
create table t_order_summary_30  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表30' ;

drop table if exists `t_order_summary_31`;
create table t_order_summary_31  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表31' ;

drop table if exists `t_order_summary_32`;
create table t_order_summary_32  (
                                     order_id         	bigint  comment '订单id'  not null,
                                     order_no         	int(11) comment '订单编号'  not null,
                                     customer_id      	int(11) comment '下单用户id'  not null,
                                     payment_method   	tinyint(4) comment '支付方式:1现金,2余额,3网银,4支付宝,5微信'  not null,
                                     order_amount     	int(11) comment '订单汇总金额 单位 分  此处为int,比bigint节约4个字节'  not null,
                                     payment_money    	int(11) comment '支付金额  单位 分  此处为int,比bigint节约4个字节'  not null,
                                     consignee_name   	varchar(50) comment '收货人姓名'  not null,
                                     consignee_address	varchar(100) comment '收货人详细'  not null,
                                     consignee_phone  	varchar(30) comment '收货人联系电话'  not null,
                                     express_comp     	varchar(30) comment '快递公司名称'  not null,
                                     express_no       	varchar(50) comment '快递单号'  not null,
                                     create_time      	timestamp comment '创建时间'  not null default current_timestamp,
                                     is_validate      	tinyint(4) comment '数据是否有效标识:1有效数据,2 无效数据'  not null default '1',
                                     update_time      	timestamp comment '最新更新时间'  not null,
                                     primary key(order_id)
)
    engine = innodb
comment = '订单汇总信息表-分表32' ;

3.ShardingSphere配置

ShardingSphere-jdbc的配置文件如下,该配置文件全部写在application.yml中。
原来的一张表的数据,将拆分到两个数据库,32张表中。拆分的方式,先通过customer_id字段,按用户取模拆分到两个数据库中。
之后按照order_id字段与32取模,再将数据拆分到32张表中。


#shardingSphereJDBC配置
spring.shardingsphere.datasource.names: gts01,gts02
spring.shardingsphere.datasource.common.type: com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.common.driver-class-name: com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.common.maxWait: 60000
spring.shardingsphere.datasource.common.initialSize: 5
spring.shardingsphere.datasource.common.minIdle: 5
spring.shardingsphere.datasource.common.maxActive: 20
spring.shardingsphere.datasource.gts01.jdbc-url: jdbc:mysql://192.168.161.114:3306/gts01?useSSL=false&autoReconnect=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.shardingsphere.datasource.gts01.username: gts
spring.shardingsphere.datasource.gts01.password: mysql
spring.shardingsphere.datasource.gts02.jdbc-url: jdbc:mysql://192.168.161.114:3306/gts02?useSSL=false&autoReconnect=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.shardingsphere.datasource.gts02.username: gts
spring.shardingsphere.datasource.gts02.password: mysql

#配置 t_order 表规则
spring.shardingsphere.rules.sharding.tables.t_order_summary.actual-data-nodes: gts01.t_order_summary_$->{1..16},gts02.t_order_summary_$->{17..32}
# 配置分库策略
spring.shardingsphere.rules.sharding.tables.t_order_summary.database-strategy.standard.sharding-column: customer_id
spring.shardingsphere.rules.sharding.tables.t_order_summary.database-strategy.standard.sharding-algorithm-name: database_inline

# 配置分表策略
spring.shardingsphere.rules.sharding.tables.t_order_summary.table-strategy.standard.sharding-column: order_id
spring.shardingsphere.rules.sharding.tables.t_order_summary.table-strategy.standard.sharding-algorithm-name: t-order-inline

# 分布式序列策略配置
spring.shardingsphere.rules.sharding.tables.t_order_summary.key-generate-strategy.column: order_id
spring.shardingsphere.rules.sharding.tables.t_order_summary.key-generate-strategy.key-generator-name: snowflake

E拆分算法
spring.shardingsphere.rules.sharding.sharding-algorithms.database-inline.type: inline
spring.shardingsphere.rules.sharding.sharding-algorithms.database-inline.props.algorithm-expression: gts0$->{customer_id % 2 + 1}
spring.shardingsphere.rules.sharding.sharding-algorithms.t-order-inline.type: inline
spring.shardingsphere.rules.sharding.sharding-algorithms.t-order-inline.props.algorithm-expression: t_order_summary_$->{order_id % 32 + 1}

#此处必须配置
spring.shardingsphere.rules.sharding.key-generators.snowflake.type: snowflake
spring.shardingsphere.rules.sharding.key-generators.snowflake.props.worker-id: 123


# 打开sql输出日志
spring.shardingsphere.props.sql.show: true
logging.level.org.springframework: debug

4. 数据测试

上述配置完成后,启动springboot项目,通过如下代码来测试:

4.1 insert

service层代码:

	public OrderSummaryEntity buildOrderSummary(int orderId) {
		Random random = new Random(System.currentTimeMillis());
		int expressNo = random.nextInt(10000000) + 10000000;
		OrderSummaryEntity orderSummaryEntity = new OrderSummaryEntity()
				.setOrderNo(orderId)
				.setConsigneeAddress("北京市朝阳区西坝河")
				.setConsigneeName("张三")
				.setConsigneePhone("13888888888")
				.setCustomerId(10001)
				.setExpressNo("1001" + expressNo)
				.setExpressComp("顺丰")
				.setPaymentMethod(1)
				.setPaymentMoney(5600)
				.setOrderAmount(5600)
				.setIsValidate(1);
		return orderSummaryEntity;
	}
	
		public void insertOrder(int orderId) {
		OrderSummaryEntity orderSummaryEntity = buildOrderSummary(orderId);
		orderSummaryDao.save(orderSummaryEntity);
	}

Controller层代码:

	@RequestMapping("/randomInsertOneOrder")
	public String randomInsertOneOrder() {
		Stopwatch stopwatch = Stopwatch.createStarted();
		Random random = new Random(10000);
		orderService.insertOrder(random.nextInt());
		log.info("randomInsertOneOrder cost time :"+ stopwatch.stop());
		return "success";
	}
	

上述代码执行后,数据完成插入数据库。
可以看到,对于order_id字段,我们没有设置任何值,ShardingSphere帮我们自动注入了雪花算法生成的值。
此外还通过随机批量插入了100000条数据。批量的数据也被注入了值。插入之后的数据库gts01情况如下:

mysql> SELECT table_name,table_rows FROM information_schema.tables where  TABLE_SCHEMA = 'gts01';
+--------------------+------------+
| table_name         | table_rows |
+--------------------+------------+
| t_order_summary_1  |       3128 |
| t_order_summary_10 |       2971 |
| t_order_summary_11 |       2612 |
| t_order_summary_12 |       3030 |
| t_order_summary_13 |       2606 |
| t_order_summary_14 |       3070 |
| t_order_summary_15 |       2648 |
| t_order_summary_16 |       2164 |
| t_order_summary_2  |       3370 |
| t_order_summary_3  |       2741 |
| t_order_summary_4  |       3130 |
| t_order_summary_5  |       2847 |
| t_order_summary_6  |       3154 |
| t_order_summary_7  |       2847 |
| t_order_summary_8  |       2622 |
| t_order_summary_9  |       2909 |
+--------------------+------------+
33 rows in set (0.00 sec)

gts02数据库的数据情况:


mysql> SELECT table_name,table_rows FROM information_schema.tables where  TABLE_SCHEMA = 'gts02';
+--------------------+------------+
| table_name         | table_rows |
+--------------------+------------+
| t_order_summary_17 |       2900 |
| t_order_summary_18 |       2710 |
| t_order_summary_19 |       2708 |
| t_order_summary_20 |       3145 |
| t_order_summary_21 |       2794 |
| t_order_summary_22 |       2646 |
| t_order_summary_23 |       2380 |
| t_order_summary_24 |       2864 |
| t_order_summary_25 |       2423 |
| t_order_summary_26 |       3311 |
| t_order_summary_27 |       2248 |
| t_order_summary_28 |       2688 |
| t_order_summary_29 |       2332 |
| t_order_summary_30 |       2470 |
| t_order_summary_31 |       2826 |
| t_order_summary_32 |       3015 |
+--------------------+------------+
32 rows in set (0.00 sec)

通过ShardingSphere完美的实现了数据库的插入。

4.2 select

Service层:

public OrderSummaryEntity queryOrderById(long order_id) {
		return orderSummaryDao.selectById(order_id);
	}

Controller层:

@RequestMapping("/queryByKey")
	public String queryByKey(String key) {
		Stopwatch stopwatch = Stopwatch.createStarted();
		Long orde_id = Long.parseLong(key);
		OrderSummaryEntity entity = orderService.queryOrderById(orde_id);
		stopwatch.stop();
		log.info("通过key查询,走索引耗时:" + stopwatch);
		return JSON.toJSONString(entity);
	}

查询请求:

http://127.0.0.1:8084/queryByKey?key=647892524325122066

上述url能够查到所需的结果。

5.所踩到的坑

5.1 key-generators.snowflake.type 必须配置

spring.shardingsphere.rules.sharding.key-generators.snowflake.type: snowflake
spring.shardingsphere.rules.sharding.key-generators.snowflake.props.worker-id: 123

这个位置必须配置,虽然前面有如下配置:

spring.shardingsphere.rules.sharding.tables.t_order_summary.key-generate-strategy.column: order_id
spring.shardingsphere.rules.sharding.tables.t_order_summary.key-generate-strategy.key-generator-name: snowflake

但是个人理解,这个key-generate-strategy.key-generator-name应该是个name命名,实际上要通过key-generators.snowflake.type 生效。
否则将会出现如下错误:

2021-09-23 21:11:26.288 [geektime-study] [restartedMain] DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] -Creating shared instance of singleton bean 'propertySourcesPlaceholderConfigurer'
2021-09-23 21:11:26.351 [geektime-study] [restartedMain] ERROR [org.springframework.boot.SpringApplication] -Application run failed
java.lang.reflect.InvocationTargetException: null
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.shardingsphere.spring.boot.util.PropertyUtil.v2(PropertyUtil.java:111)
	at org.apache.shardingsphere.spring.boot.util.PropertyUtil.handle(PropertyUtil.java:75)
	at org.apache.shardingsphere.spring.boot.registry.AbstractAlgorithmProvidedBeanRegistry.registerBean(AbstractAlgorithmProvidedBeanRegistry.java:50)
	at org.apache.shardingsphere.sharding.spring.boot.algorithm.KeyGenerateAlgorithmProvidedBeanRegistry.postProcessBeanDefinitionRegistry(KeyGenerateAlgorithmProvidedBeanRegistry.java:38)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:142)
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:338)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332)
	at com.dhb.gts.javacourse.week8.Starter.main(Starter.java:12)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: java.util.NoSuchElementException: No value bound
	at org.springframework.boot.context.properties.bind.BindResult.get(BindResult.java:55)
	... 24 common frames omitted
2021-09-23 21:11:26.353 [geektime-study] [restartedMain] DEBUG [org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext] -Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@52353625, started on Thu Sep 23 21:11:25 CST 2021
Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: java.lang.reflect.UndeclaredThrowableException
	at org.springframework.util.ReflectionUtils.rethrowRuntimeException(ReflectionUtils.java:147)
	at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:817)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:348)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332)
	at com.dhb.gts.javacourse.week8.Starter.main(Starter.java:12)
	... 5 more
Caused by: java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.shardingsphere.spring.boot.util.PropertyUtil.v2(PropertyUtil.java:111)
	at org.apache.shardingsphere.spring.boot.util.PropertyUtil.handle(PropertyUtil.java:75)
	at org.apache.shardingsphere.spring.boot.registry.AbstractAlgorithmProvidedBeanRegistry.registerBean(AbstractAlgorithmProvidedBeanRegistry.java:50)
	at org.apache.shardingsphere.sharding.spring.boot.algorithm.KeyGenerateAlgorithmProvidedBeanRegistry.postProcessBeanDefinitionRegistry(KeyGenerateAlgorithmProvidedBeanRegistry.java:38)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:142)
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:338)
	... 8 more
Caused by: java.util.NoSuchElementException: No value bound
	at org.springframework.boot.context.properties.bind.BindResult.get(BindResult.java:55)
	... 24 more

5.2 数据库建表语句最好用小写

还犯了一个错误就是数据库的大小写问题,数据库一开始设置为了大小写敏感。用大写创建的数据库。
但是执行的时候一直出现如下错误:

Error updating database. Cause: java.lang.NullPointerException: Cannot invoke method mod() on null object
The error may involve org.dromara.hmily.demo.common.order.mapper.OrderMapper.save-Inline
The error occurred while setting parameters
SQL: insert into t_order (create_time,number,status,product_id,total_amount,count,user_id) values ( ?,?,?,?,?,?,?)
Cause: java.lang.NullPointerException: Cannot invoke method mod() on null object] with root cause
java.lang.NullPointerException: Cannot invoke method mod() on null object
at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91) ~[groovy-2.4.19-indy.jar:2.4.19]
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:47) ~[groovy-2.4.19-indy.jar:2.4.19]
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) ~[groovy-2.4.19-indy.jar:2.4.19]
at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java:34) ~[groovy-2.4.19-indy.jar:2.4.19]
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) ~[groovy-2.4.19-indy.jar:2.4.19]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116) ~[groovy-2.4.19-indy.jar:2.4.19]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128) ~[groovy-2.4.19-indy.jar:2.4.19]
at Script6$_run_closure1.doCall(Script6.groovy:1) ~[na:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201]
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98) ~[groovy-2.4.19-indy.jar:2.4.19]
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) ~[groovy-2.4.19-indy.jar:2.4.19]
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:264) ~[groovy-2.4.19-indy.jar:2.4.19]
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034) ~[groovy-2.4.19-indy.jar:2.4.19]
at groovy.lang.Closure.call(Closure.java:420) ~[groovy-2.4.19-indy.jar:2.4.19]
at groovy.lang.Closure.call(Closure.java:414) ~[groovy-2.4.19-indy.jar:2.4.19]

这个错误非常隐蔽,最终参考了github https://github.com/apache/shardingsphere/issues/8571

最终的解决方案是数据库建表语句用小写,生成的代码,以及ShardingSphere相关的配置都统一采用小写,这个问题就解决了。

更多推荐