首页 > 其他分享 >Spring Boot集成Sharding JDBC分库分表

Spring Boot集成Sharding JDBC分库分表

时间:2023-08-10 15:32:55浏览次数:35  
标签:COMMENT 分库 Spring Boot order jdbc sharding NULL id

背景

近期公司购物车项目需要使用Sharding JDBC分表,特记录下。ps:未分库

依赖引入

<!-- sharding-sphere Version:4.1.1-->
<dependency>
  <groupId>org.apache.shardingsphere</groupId>
  <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
  <version>${sharding-sphere.version}</version>
</dependency>
<dependency>
  <groupId>org.apache.shardingsphere</groupId>
  <artifactId>sharding-jdbc-spring-namespace</artifactId>
  <version>${sharding-sphere.version}</version>
</dependency>

数据库创建

使用函数批量创建,可参考如下函数,测试情况下可创建数量while @j < 表数量 do修改为4张表即可

CREATE DEFINER=`root`@`%` PROCEDURE `batch_create`()
begin
set @str = " (
    `id`            bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '购物车项主键',
    `user_id`       bigint(20) unsigned NOT NULL COMMENT '用户ID',
    `business_type` tinyint(4)          NOT NULL DEFAULT '1' COMMENT '业务线类型 1自取、2包邮、3外卖、4海鲜专送',
    `site_id`       bigint(20)                   DEFAULT '0' COMMENT '地点ID(营业部或门店ID)',
    `group_id`      bigint(20)                   DEFAULT '0' COMMENT '运营组id',
    `item_sku_id`   bigint(20) unsigned NOT NULL COMMENT '商家商品SkuId',
    `merchant_id`   bigint(20)                   DEFAULT '0' COMMENT '商家编码',
    `quantity`      int(10) unsigned    NOT NULL COMMENT '商品数量',
    `create_time`   datetime            NOT NULL COMMENT '创建时间',
    `update_time`   datetime            NOT NULL COMMENT '修改时间',
    `is_selected`   tinyint(4)          NOT NULL DEFAULT '2' COMMENT '是否选中 1未选中 2选中',
    `extra`         varchar(1024)                DEFAULT NULL COMMENT '扩展字段',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uni_cart` (`user_id`, `business_type`, `site_id`, `item_sku_id`),
    KEY `idx_user_id` (`user_id`),
    KEY `idx_id_and_quantity` (`id`, `quantity`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1000000
  DEFAULT CHARSET = utf8mb4 COMMENT ='购物车' ";
set @j = 0;
while @j < 4 do
set @table = concat('cart_',@j);
set @sql_t = concat("CREATE TABLE ",@table,@str);
prepare sql_t from @sql_t;
execute sql_t;
set @j = @j + 1;
end while;
end

YAML配置

logging:
  level:
    com.atmoon.sharding.mapper: info
spring:
  profiles:
    active: dev
  shardingsphere:
    props:
      sql.show: true # 线上环境需要关闭
    datasource:
      names: ds0
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/sharding-jdbc?serverTimezone=Asia/Shanghai&autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
        username: root
        password: ******
        maxActive: 100
        maxWait: 1000
    sharding:
      default-data-source-name: ds0
      tables:
        cart:
          keyGenerator:
            type: SNOWFLAKE
            column: id
          actual-data-nodes: ds0.cart_$->{0..3} #表后缀从0开始这里为0..n-1, 后缀从1开始这里为1..n, n为多少张表,
          database-strategy:
            inline:
              sharding-column: id
              algorithm-expression: ds0
          table-strategy:
            inline:
              sharding-column: id
              algorithm-expression: cart_$->{id.intdiv(1000) % 4} #建议多少张表余多少
  application:
    name: cart-demo
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss
mybatis-plus:
  mapper-locations: classpath:/mapping/*.xml
  configuration:
    # 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射
    map-underscore-to-camel-case: true
    cache-enabled: false
    # 开启mybatis-plus全sql 打印,仅可开发测试环境开启
    # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: com.jarvan.sharding.entity
  global-config:
    db-config:
      # 主键类型  AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
      id-type: AUTO
      update-strategy: not_null
      #驼峰下划线转换
      column-underline: true
      logic-delete-value: 1
      logic-not-delete-value: 0

插入测试

public class CartMapperTest extends BaseTest {


    @Autowired
    CartMapper cartMapper;

    @Test
    public void addTest() {
        for (long i = 1; i < 15; i++) {
            CartDO cart = new CartDO(null, i, 1, 1L, 1L,
                    i, 1001L, 1, new Date(), new Date(), 1, null);
            cartMapper.insert(cart);
        }
    }

    @Test
    public void findTest() {
        List<CartDO> byUserId = cartMapper.findByUserId(1);
        Assert.assertTrue(byUserId.size() > 0);
    }
}

测试结果

upload successful

分库配置

分库配置参考如下

dataSources:
  ds0: !!org.apache.commons.dbcp.BasicDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ds0
    username: root
    password: 
  ds1: !!org.apache.commons.dbcp.BasicDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ds1
    username: root
    password: 

shardingRule:  
  tables:
    t_order: 
      actualDataNodes: ds${0..1}.t_order${0..1}
      databaseStrategy:
        inline:
          shardingColumn: user_id
          algorithmExpression: ds${user_id % 2}
      tableStrategy: 
        inline:
          shardingColumn: order_id
          algorithmExpression: t_order${order_id % 2}
      keyGenerator:
        type: SNOWFLAKE
        column: order_id
    t_order_item:
      actualDataNodes: ds${0..1}.t_order_item${0..1}
      databaseStrategy:
        inline:
          shardingColumn: user_id
          algorithmExpression: ds${user_id % 2}
      tableStrategy:
        inline:
          shardingColumn: order_id
          algorithmExpression: t_order_item${order_id % 2}  
  bindingTables:
    - t_order,t_order_item
  broadcastTables:
    - t_config
  
  defaultDataSourceName: ds0
  defaultTableStrategy:
    none:
  defaultKeyGenerator:
    type: SNOWFLAKE
    column: order_id
  
props:
  sql.show: true

项目地址

https://github.com/JarvanBest/sharding-demo.git/

标签:COMMENT,分库,Spring,Boot,order,jdbc,sharding,NULL,id
From: https://blog.51cto.com/u_11906056/7036344

相关文章

  • F1C100s支持从Nand启动了,顺便说下如何向 U-Boot SPL 添加一个Image Loader
    让F1C100s从SPINand启动Tableofcontents名词解释写在前面启动流程实现[内核][文件系统][打包烧录]优化思路更多参考资料名词解释名词解释SPL第二阶段程序加载器BootROM固化在芯片内部的程序,用来识别并加载固件写在前面本次实验平台基于......
  • SpringCloud
    SpringCloud这个阶段该如何让学习:三层架构+MVC框架:SpringIOCAOPSpringBoot新一代的JavaEE开发标准模块化allinone模块化开发===allinone代码没变化微服务架构4个核心问题?1.服务很多,客户端怎么访问?2.这么多服务?服务之间如何通信?3.这么多......
  • 什么是Redis,如何使用Redis,SpringBoot如何集成Redis
    官网链接:Redis首先简单理解一下1、什么是redisredis是一种开源的、内存中数据结构存储,用作数据库、缓存和消息代理。redis数据结构包含五大数据类型:字符串、散列、列表、集合、带范围查询的排序集合以及三大特殊数据类型:位图、超级日志、地理空间索引。redis内置复制、Lua脚本......
  • BeanDefinition解密:构建和管理Spring Beans的基石
    本文分享自华为云社区《Spring高手之路11——BeanDefinition解密:构建和管理SpringBeans的基石》,作者:砖业洋__。BeanDefinition是Spring中一个非常重要的概念,它包含了Spring容器用于创建、配置Bean所需的所有信息。理解BeanDefinition可以帮助我们深入掌握Spring的内部工作机......
  • spring多数据源动态切换的实现原理及读写分离的应用
    简介AbstractRoutingDataSource是Spring框架中的一个抽象类,可以实现多数据源的动态切换和路由,以满足复杂的业务需求和提高系统的性能、可扩展性、灵活性。应用场景多租户支持:对于多租户的应用,根据当前租户来选择其对应的数据源,实现租户级别的隔离和数据存储。分库分表:为了提高性能......
  • Spring Boot常见企业开发场景应用、自动配置原理结构分析
     读者应具备:SpringSpringMVC服务器端开发基础Maven基础本篇主要介绍SpringBoot在企业开发中常见场景的使用、以及SpringBoot的基本原理结构。以下为本篇设计的技术应用场景:构建SpringJava程序构建JUnit测试用例构建SpringJDBCTemplate应用程序操作数据库构建Servlet、JSP程......
  • Spring cloud智慧工地源码(项目端+监管端+数据大屏+APP)
    【智慧工地PC项目端功能总览】一.项目人员管理包括:信息管理、信息采集、证件管理、考勤管理、考勤明细、工资管理、现场统计、WIFI教育、工种管理、分包商管理、班组管理、项目管理。1.信息管理:头像、姓名、性别、身份证、进场时间、分包单位、劳务工种、项目履历、是否零工、计......
  • SpringBoot3文件管理
    目录一、简介二、工程搭建1、工程结构2、依赖管理三、上传下载1、配置管理2、上传下载四、Excel文件1、Excel创建2、Excel读取3、解析监听4、导入导出五、参考源码标签:上传.下载.Excel.导入.导出;一、简介在项目中,文件管理是常见的复杂功能;首先文件的类型比较多样,处理起来比......
  • 10、Spring之AOP概述
    10.1、概念AOP(AspectOrientedProgramming)是一种设计思想,是软件设计领域中的面向切面编程AOP是面向对象编程(OOP)的一种补充和完善,OOP是纵向继承机制,AOP是横向抽取机制AOP能通过预编译方式和运行期动态代理方式,实现在不修改源代码的情况下动态地为程序添加统一的附加功能......
  • spring-mvc 系列:拦截器和异常处理器
    目录一、拦截器的配置二、拦截器的三个抽象方法三、多个拦截器的执行顺序四、基于配置的异常处理器五、基于注解的异常处理器一、拦截器的配置SpringMVC中的拦截器用于拦截控制器方法的执行SpringMVC中的拦截器需要实现HandlerInterceptorSpringMVC的拦截器必须在SpringMVC的......