美文网首页分库分表
分库分表-shardingsphere+springboot+m

分库分表-shardingsphere+springboot+m

作者: dbasy | 来源:发表于2021-08-05 23:21 被阅读0次

当用户量级超过10万,或者单表数据量超过1000万,单台数据库的性能将无法支撑业务的发展,所以我们必须考虑分库分表方案了,这里我们设计为2库4表方案

image.png
docker启动两个mysql实例,作为两库
image.png
image.png
建表语句 先建schema然后建table
create table t_order0
(
    id          bigint      not null
        primary key,
    order_name  varchar(20) null,
    insert_date datetime    null,
    user_id     bigint      null
);

create table t_order1
(
    id          bigint      not null
        primary key,
    order_name  varchar(20) null,
    insert_date datetime    null,
    user_id     bigint      null
);


pom文件需要的依赖
  <!-- spring-boot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- 分库分表 -->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3.1</version>
        </dependency>
        <!-- spring-boot-devtools -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--        <dependency>-->
        <!--            <groupId>com.zaxxer</groupId>-->
        <!--            <artifactId>HikariCP</artifactId>-->
        <!--            <version>3.4.3</version>-->
        <!--        </dependency>-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.6</version>
        </dependency>
application.yml配置文件
spring:
  shardingsphere:
    datasource:
      names: test0,test1
      test0:
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://127.0.0.1:3306/schema_test0
        username: root
        password: 123456
      test1:
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://127.0.0.1:3307/schema_test1
        username: root
        password: 123456
    sharding:
      default-database-strategy:
        inline:
          sharding-column: user_id
          algorithm-expression: test$->{user_id % 2}
      tables:
        t_order:
          actual-data-nodes: test$->{0..1}.t_order$->{0..1}
          table-strategy:
            inline:
              sharding-column: id
              algorithm-expression: t_order$->{id % 2}
    props:
      sql:
        show:
          true
整合mybatis-plus 采用configration方式
@Configuration
@MapperScan("com.cmx.dbasy.sharding.mapper")
public class MybatisPlusConfigration {
}

创建实体类

注意事项
1.使用IdType.ASSIGN_ID策略(自3.3.0起)。该策略会使用雪花算法自动生成主键ID,主键类型为长或字符串(分别对应的MySQL的表字段为BIGINT和VARCHAR)
2.id类型用封装类,否则会提示This primary key of "id" is primitive !不建议如此请使用包装类 in Class: "com

@Data
@TableName("t_order")
public class Order {
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String orderName;
    private Long userId;
    private Date insertDate;
}
创建mapper类,实现BaseMapper
@Mapper
public interface OrderMapper extends BaseMapper<Order> {

}
创建测试类

1.模拟10个随机用户产生订单,先根据用户id除以2取模,进行分库。
2.然后根据用户生产的订单id,再次除以2取模,进行分表。
3.生产100个订单

@SpringBootTest
public class ShadingMapperTests {
   @Autowired(required = false)
   private OrderMapper orderMapper;
   /*模拟10个用户*/
   private Long[] userIds = new Long[]{0L, 1L, 2L, 3L, 4L, 5L, 7L, 8L, 9L};


   @Test
   public void testInsert() {
       for (int i = 1; i <= 100; i++) {
           Order order = new Order();
           order.setUserId(userIds[new Random().nextInt(9)]);
           order.setOrderName("orderName" + i);
           order.setInsertDate(new Date());
           orderMapper.insert(order);

       }
   }
}
查看结果

user_id为偶数,且id为偶数的进入db0 table0表


image.png

总共产生100条订单数据

分析
2021-08-05 23:09:22.762  INFO 1122 --- [           main] ShardingSphere-SQL                       : SQLStatement: InsertStatementContext(super=CommonSQLStatementContext(sqlStatement=org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement@20cff21e, tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@49b89425), tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@49b89425, columnNames=[id, order_name, user_id, insert_date], insertValueContexts=[InsertValueContext(parametersCount=4, valueExpressions=[ParameterMarkerExpressionSegment(startIndex=73, stopIndex=73, parameterMarkerIndex=0), ParameterMarkerExpressionSegment(startIndex=76, stopIndex=76, parameterMarkerIndex=1), ParameterMarkerExpressionSegment(startIndex=79, stopIndex=79, parameterMarkerIndex=2), ParameterMarkerExpressionSegment(startIndex=82, stopIndex=82, parameterMarkerIndex=3)], parameters=[1423300102633619458, orderName99, 7, 2021-08-05 23:09:22.762])], generatedKeyContext=Optional.empty)
2021-08-05 23:09:22.762  INFO 1122 --- [           main] ShardingSphere-SQL                       : Actual SQL: test1 ::: INSERT INTO t_order0  ( id,
order_name,
user_id,
insert_date )  VALUES  (?, ?, ?, ?) ::: [1423300102633619458, orderName99, 7, 2021-08-05 23:09:22.762]
2021-08-05 23:09:22.769  INFO 1122 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO t_order  ( id,
order_name,
user_id,
insert_date )  VALUES  ( ?,
?,
?,
? )

逻辑sql语句

Logic SQL: INSERT INTO t_order  ( id,
order_name,
user_id,
insert_date )  VALUES  ( ?,
?,
?,
? )

实际sql语句

Actual SQL: test0 ::: INSERT INTO t_order1  ( id,
order_name,
user_id,
insert_date )  VALUES  (?, ?, ?, ?) ::: [1423300096988086273, orderName2, 2, 2021-08-05 23:09:21.415]

相关文章

网友评论

    本文标题:分库分表-shardingsphere+springboot+m

    本文链接:https://www.haomeiwen.com/subject/mqxcultx.html