1.继上一篇文章的基础上进行实现分库分表操作 application.yml配置文件为:
spring: shardingsphere: datasource: names: ds-0,ds-1 ds_0: url: jdbc:mysql://127.0.0.1:3306/ds-0?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false&useInformationSchema=false driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource username: root password: hzp123456 ds_1: url: jdbc:mysql://127.0.0.1:3306/ds-1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false&useInformationSchema=false driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource username: root password: hzp123456 sharding: tables: user: actual-data-nodes: ds-$->{0..1}.user database-strategy: standard: sharding-column: age precise-algorithm-class-name: com.shardingsphere.algorithm.DefaultModuloPreciseShardingAlgorithm key-generator: column: id type: SNOWFLAKE props: worker.id: 11 executor.size: 4 max.connections.size.per.query: 1 check.table.metadata.enabled: false message: actual-data-nodes: ds-$->{0..1}.message_$->{0..1} database-strategy: standard: sharding-column: contact_id precise-algorithm-class-name: com.shardingsphere.algorithm.DefaultModuloPreciseShardingAlgorithm table-strategy: standard: sharding-column: msg_id precise-algorithm-class-name: com.shardingsphere.algorithm.DefaultModuloPreciseShardingAlgorithm key-generator: column: msg_id type: SNOWFLAKE props: worker.id: 22 executor.size: 4 max.connections.size.per.query: 1 check.table.metadata.enabled: false props: sql.show: true
主要对以上配置文件中的message表进行分库分表 如以上根据message表中的contact_id进行分库 根据contact_id的奇偶数判断 分别入库到ds-0 ds-1中 根据message表中的msg_id进行分表 根据 msg_id的奇偶数判断 分别入库到ds-0 ds-1中message_0,message_1 执行的先后顺序是先分库后分表
2.在库ds-0 ds-1中分别创建表message_0,message_1 创建脚本如下:
DROP TABLE IF EXISTS `message_0`;
CREATE TABLE `message_0` (
`msg_id` bigint(20) NOT NULL,
`contact_id` bigint(20) NOT NULL,
`user_id` bigint(20) NOT NULL,
`user_tag` bit(1) NULL DEFAULT NULL,
`recall_time` datetime NULL DEFAULT NULL,
`content` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`push_msg` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`creation_time` datetime NULL DEFAULT NULL,
PRIMARY KEY (`msg_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
DROP TABLE IF EXISTS `message_1`;
CREATE TABLE `message_1` (
`msg_id` bigint(20) NOT NULL,
`contact_id` bigint(20) NOT NULL,
`user_id` bigint(20) NOT NULL,
`user_tag` bit(1) NULL DEFAULT NULL,
`recall_time` datetime NULL DEFAULT NULL,
`content` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`push_msg` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`creation_time` datetime NULL DEFAULT NULL,
PRIMARY KEY (`msg_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
3.创建Message实体类:
package com.shardingsphere.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * 发送消息内容 */ @Data public class Message implements Serializable { private static final long serialVersionUID = 2921554930924807501L; @TableId(type = IdType.ASSIGN_ID) private Long msgId; private Long contactId; private Long userId; private Boolean userTag; private Date recallTime; private String content; private String pushMsg; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") private Date creationTime; }
4.创建MessageMapper接口 并继承mybatisPlus中的BaseMapper 代码如下:
package com.shardingsphere.Mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.shardingsphere.entity.Message; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; /** * @Author 何志鹏 * @Date 2022/7/18 10:59 * @Version 1.0 */ @Mapper @Repository public interface MessageMapper extends BaseMapper<Message> { }
5.创建测试方法DemoTest:
package com.shardingsphere; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.IdUtil; import cn.hutool.json.JSONUtil; import com.shardingsphere.Mapper.MessageMapper; import com.shardingsphere.entity.Message; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.Date; /** * @Author 何志鹏 * @Date 2022/7/15 15:15 * @Version 1.0 */ @SpringBootTest public class DemoTest { @Autowired private MessageMapper messageMapper; /** * 测试Message分库 */ @Test void addMessage() { for (int i = 0; i < 10000; i++) { new Thread(new Runnable() { @Override public void run() { Message message = new Message(); int randomNum = (int) (Math.random() * 9000 + 1000); Snowflake snowflake = IdUtil.createSnowflake(1, 1); message.setContactId(snowflake.nextId()+randomNum); message.setUserId(new Long(randomNum)); message.setUserTag(Boolean.TRUE); message.setRecallTime(new Date()); message.setContent("测试测试"); message.setPushMsg("111111111111"); message.setCreationTime(new Date()); messageMapper.insert(message); } }).run(); } //ds-0库 Message ds_0_Message_0 = messageMapper.selectById(755815881623298048L); System.err.println("ds-0库Message_0表:"+JSONUtil.parseObj(ds_0_Message_0)); Message ds_0_Message_1 = messageMapper.selectById(755815839168552961L); System.err.println("ds-0库Message_1表:"+JSONUtil.parseObj(ds_0_Message_1)); //ds-1库 Message ds_1_Message_0 = messageMapper.selectById(755815841399922688L); System.err.println("ds-1库Message_0表:"+JSONUtil.parseObj(ds_1_Message_0)); Message ds_1_Message_1 = messageMapper.selectById(755815845208350721L); System.err.println("ds-1库Message_1表:"+JSONUtil.parseObj(ds_1_Message_1)); } } 6.查看数据库中的插入数据和查询的结果 如下:
最后附上代码: https://gitee.com/hezhipeng_ek/shardingsphere.git