ShardingSphere分表

docker创建数据库

安装指定版本mysql

sudo docker pull mysql:8.0.29

启动order1-3310

docker run -d \
-p 3310:3306 \
-v /study/shardingsphere/mysql/order1/conf:/etc/mysql/conf.d \
-v /study/shardingsphere/mysql/order1/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name dk-mysql-order1 \
mysql:8.0.29

重启MySQL容器

docker restart dk-mysql-order1

设置mysql容器在docker启动的时候启动

docker update dk-mysql-order1 --restart=always

使用命令行登录MySQL服务器:

#进入容器:env LANG=C.UTF-8 避免容器中显示中文乱码
docker exec -it dk-mysql-order1 env LANG=C.UTF-8 /bin/bash
#进入容器内的mysql命令行
mysql -uroot -p
#修改默认密码校验方式(不执行,navicat无法连接
ALTER USER ‘root’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘123456’;

ShardingSphere接入进行分表插入和查询

官网地址:

https://shardingsphere.apache.org/document/5.1.1/cn/user-manual/shardingsphere-jdbc/spring-boot-starter/rules/sharding/

pom.xml

同下面这个地址
https://blog.csdn.net/qq_41082640/article/details/131097769
OrderPo


import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Builder;
import lombok.Data;

import java.math.BigDecimal;

@Data
    @TableName("t_order")
    @Builder
    public class OrderPo {
        // @TableId(type = IdType.ASSIGN_ID)//分布式id
        @TableId(type = IdType.AUTO)
        private Long id;
        private String orderNo;
        private Long userId;
        private BigDecimal amount;
    }

OrderMapper
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dk.shardingjdbcdemo.dto.OrderPo;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface OrderMapper extends BaseMapper<OrderPo> {
}
application.properties
spring.application.name=ShardingJdbcDemo
server.servlet.context-path=/shardingJdbcDemo

spring.shardingsphere.props.sql-show=true

#内存模式
spring.shardingsphere.mode.type=Memory

# 配置真实数据源
spring.shardingsphere.datasource.names=order1

# 配置第 1 个数据源
spring.shardingsphere.datasource.order1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.order1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.order1.jdbc-url=jdbc:mysql://192.168.229.128:3310/db_order
spring.shardingsphere.datasource.order1.username=root
spring.shardingsphere.datasource.order1.password=123456

# 由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持 inline 表达式。缺省表示使用已知数据源与逻辑表名称生成数据节点,用于广播表(即每个库中都需要一个同样的表用于关联查询,多为字典表)或只分库不分表且所有库的表结构完全一致的情况
#spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=order1.t_order_0,order1.t_order_1
spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=order1.t_order$->{0..1}

##-----------------------------------行表达式分片(INLINE)算法进行分表配置-------------------------------------------
##------------------------分库策略
## 分片列名称
#spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-column=user_id
## 分片算法名称
#spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-algorithm-name=alg_inline_userid
##------------------------分片算法配置  ## 行表达式分片算法
## 分片算法类型
#spring.shardingsphere.rules.sharding.sharding-algorithms.alg_inline_userid.type=INLINE
## 分片算法属性配置
#spring.shardingsphere.rules.sharding.sharding-algorithms.alg_inline_userid.props.algorithm-expression=t_order$->{user_id % 2}

#-----------------------------------HASH分片算法进行分表配置-------------------------------------------
# 标准分片表配置
# 分片列名称,多个列以逗号分隔
spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-column=order_no
# 分片算法名称
spring.shardingsphere.rules.sharding.tables.t_order.table-strategy.standard.sharding-algorithm-name=alg_hash
##------------------------分片算法配置  ## HASH_MOD算法
# 分片算法配置
spring.shardingsphere.rules.sharding.sharding-algorithms.alg_hash.type=HASH_MOD
# 分片算法属性配置
spring.shardingsphere.rules.sharding.sharding-algorithms.alg_hash.props.sharding-count=2

测试行表达式分片(INLINE)分片算法
OrderMapperTest-测试插入
import com.dk.shardingjdbcdemo.dto.OrderPo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
public class OrderMapperTest {
    @Resource
    private  OrderMapper orderMapper;

    @Test
    public void testInsertUser(){
        for (long i = 0; i < 4; i++) {
            orderMapper.insert(OrderPo.builder().userId(i).build());
        }
    }
}

插入结果

image.png
可以看出是已经根据userid进行分表插入了

测试查询
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
public class OrderMapperTest {
    @Resource
    private  OrderMapper orderMapper;

    @Test
    public void testInsertUser(){
        // for (long i = 0; i < 4; i++) {
        //     orderMapper.insert(OrderPo.builder().userId(i).build());
        // }
        for (int i = 0; i < 4; i++) {
            orderMapper.selectList(null);
        }
    }
}
测试查询结果

image.png
可以看出查询时,shardingsphere进行了union结果

测试HASH分片算法
插入测试类代码
for (long i = 0; i < 4; i++) {
    orderMapper.insert(OrderPo.builder().orderNo("orderNo00"+i).build());
}
测试插入结果

image.png
也根据order_no进行了hash取模运算

测试查询结果

image.png
和inline一样,都是把结果合并返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不积跬步无以至千里-陕西西安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值