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

Spring Boot集成Sharding JDBC分库分表

时间:2023-08-17 14:00:41浏览次数:33  
标签: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/7122196

相关文章

  • Spring事务与锁的一些事
    1.Spring事务与synchronized顺序问题结论:保证释放锁在事务提交之后当一个方法加上事务后,在执行前要先开启事务,然后再执行目标方法,当目标方法执行完后提交事务。自然获取锁是在开启事务后才执行的操作,一个线程获取到锁,到执行完业务再到释放锁后,此时事务还未提交,此时另外一个......
  • Spring实现幂等性的方法
    在开发Web应用程序时,确保接口的幂等性是一项重要任务。幂等性是指对同一个请求的多次执行应该产生相同的结果,而不会引起不正确的操作或数据损坏。在Spring框架中,我们可以利用一些功能和工具来实现幂等性。本文将介绍一种基本的方法来在Spring中实现幂等性。1.幂等性的概念和原则在......
  • Springboot 转化器
    Springboot提供了很多转化器:其中有ApplicationConversionService:extendsFormattingConversionService。 publicstaticvoidaddApplicationConverters(ConverterRegistryregistry){ addDelimitedStringConverters(registry); registry.addConverter(newStringToDurationC......
  • 社区版idea 开发springmvc踩坑指南
    说明:社区版的idea不支持spring和web,所以在开发时跟旗舰版有些许不同,不同于旗舰版在加载spring,web子模块时社区版需要手动加载tomcat下的所有lib项目以及pro下加载的所有的依赖项lib到libraries中。此外社区版idea在springmvc开发时由于不直接支持web项目所以需要在pro项目的src目录......
  • SSO单点登录(SpringSecurity OAuth2.0 redis mysql jwt)
    SSO单点登录什么是单点登录SSO(SingleSignOn)在多系统架构中,用户只需要一次登录就可以无需再次登录(比如你在打开淘宝之后点击里边的天猫)在以前我们的单系统中,用户如果登录多个服务需要多次登录,实现单点登录之后,可以实现一次登录,全部登录!一次注销,全部注销原理图用户......
  • java springboot excel 上传
    spring.http.multipart.location=/data/server/upload/spring.http.multipart.max-file-size=2048MBspring.http.multipart.max-request-size=2048MBimportjava.io.File;importjavax.servlet.MultipartConfigElement;importorg.springframework.beans.factory.ann......
  • 基于SpringBoot的点餐系统的设计与实现-计算机毕业设计源码+LW文档
    摘要:随着移动互联网的快速发展,微信小程序作为一种轻量级、快速启动、无需下载安装的应用程序形式,在市场中越来越受欢迎。同时,餐饮行业也是一个充满机会的领域,尤其是在新冠疫情后,外卖、自取等模式逐渐成为餐饮行业的主要销售方式。因此,开发一款基于微信小程序的点餐系统,能够提高餐......
  • 基于springboot小区共享车位平台的设计与实现
    随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,小区共享车位平台就是信息时代变革中的产物之一。任何系统都要遵循系统设计的基本流程,本系......
  • 基于springcolud微服务的超市仓库管理系统
    随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,超市仓库管理系统就是信息时代变革中的产物之一。任何系统都要遵循系统设计的基本流程,本系......
  • 基于SpringMVC的订餐管理微平台
    订餐管理系统是为餐饮商家提供的在线订餐管理系统,本系统的研发设计能够增加餐饮商家的菜品宣传和推广,提升客流量和订单量,增加商家的营业收益。原有的订餐系统管理采用手工管理的方式,各种菜品宣传和订单接收都采用纸质宣传和电话接单处理,这种管理手段在短期的宣传结束之后,可以方便的......