SpringBoot集成Sharding-jdbc(水平分表)

SpringBoot集成Sharding-jdbc(水平分表)

码农世界 2024-06-01 后端 148 次浏览 0个评论

SpringBoot集成Sharding-jdbc(水平分表)

  • 1.Sharding-jdbc的应用场景
  • 2.实际使用
    • 2.0 项目层级
    • 2.1 导入依赖
    • 2.2 application.yml配置
    • 2.3 dao层
    • 2.4 对应的mybatis的xml文件
    • 2.5 Service层
    • 2.6 pojo
    • 2.7 controller
    • 2.8 多线程配置

      1.Sharding-jdbc的应用场景

      其实就是针对分库分表后的操作简化,相当于增强版的JDBC驱动

      框架:

      SpringBoot集成Sharding-jdbc(水平分表)

      执行步骤:

      • 解析SQL,获取片键值,在本文中设置的片键值是order_id
      • Sharding-JDBC通过规则配置t_order_$->{order_id % 2+1},可知当order_id为偶数时,应该往t_order_1表中插数据,为奇数时,往t_order_2表中插入数据
      • 那么Sharding-JDBC根据order_id的值改写SQL语句,改写后的SQL语句是真实要执行的SQL语句
      • 接着,执行改写后的真实SQL语句
      • 最后将所有真正执行的SQL结果进行合并汇总,返回

        从上面的执行过程可知,只需要配置好片键值,Sharding-JDBC自动帮你根据规则请求表,极大了简化了开发

        2.实际使用

        2.0 项目层级

        SpringBoot集成Sharding-jdbc(水平分表)

        2.1 导入依赖

        
        
            4.0.0
            com.test.sharding
            Sharding-JDBC-Test
            0.0.1-SNAPSHOT
            Sharding-JDBC-Test
            Sharding-JDBC-Test
            
                1.8
                UTF-8
                UTF-8
                2.4.2
            
            
                
                    org.springframework.boot
                    spring-boot-starter-web
                
                
                    org.projectlombok
                    lombok
                    true
                
                
                    org.springframework.boot
                    spring-boot-starter-test
                    test
                
                
                
                    org.mybatis.spring.boot
                    mybatis-spring-boot-starter
                    2.3.0
                
                
                    mysql
                    mysql-connector-java
                    8.0.28
                
                
                
                    com.alibaba
                    druid-spring-boot-starter
                    1.2.8
                
                
                
                
                    org.apache.shardingsphere
                    sharding-jdbc-spring-boot-starter
                    4.0.0-RC1
                
                
                
                    com.github.pagehelper
                    pagehelper-spring-boot-starter
                    1.4.0
                
                
                    org.junit.jupiter
                    junit-jupiter-api
                    test
                
                
                    javax.xml.bind
                    jaxb-api
                    2.3.1
                
                
                    com.sun.xml.bind
                    jaxb-impl
                    2.3.1
                
                
                    org.glassfish.jaxb
                    jaxb-runtime
                    2.3.1
                
                
                    junit
                    junit
                    test
                
                
                    junit
                    junit
                    test
                
            
            
                
                    
                        org.springframework.boot
                        spring-boot-dependencies
                        ${spring-boot.version}
                        pom
                        import
                    
                
            
            
                
                    
                        org.apache.maven.plugins
                        maven-compiler-plugin
                        3.8.1
                        
                            1.8
                            1.8
                            UTF-8
                        
                    
                    
                        org.springframework.boot
                        spring-boot-maven-plugin
                        ${spring-boot.version}
                        
                            com.test.sharding.ShardingJdbcTestApplication
                            true
                        
                        
                            
                                repackage
                                
                                    repackage
                                
                            
                        
                    
                
            
        
        

        这里需要特别注意SpringBoot、Sharding-jdbc和mybatis的版本,之前我使用的是最新的SpringBoot3.24版本,而Sharding-jdbc无论用啥版本都报错,显示无法找到url,驱动类。然后如果mybatis版本比较低的话,就会导致使用@Autowired无法自动注入,找不到对应的Bean。

        因此,最好的解决方式就是使用SpringBoot的2.x版本,Jdk1.8即可。

        2.2 application.yml配置

        server:
          port: 8080
        mybatis:
          #mapper文件存放位置
          mapper-locations: classpath:/mapper/*.xml
          # 实体类的存放地址
          type-aliases-package: com.test.sharding.domain.pojo
          configuration:
            # 是否开启驼峰 Ming == m_ing
            map-underscore-to-camel-case: true
        spring:
          main:
            allow-bean-definition-overriding: true
          application:
            name: sharding-jdbc-test
          shardingsphere:
            props:
              sql:
                show: true
            datasource:
              names: db1
              db1:
                type: com.alibaba.druid.pool.DruidDataSource
                #mysql驱动
                driver-class-name: com.mysql.cj.jdbc.Driver
                url: jdbc:mysql://localhost:3306/sharding-jdbc-test?useUnicode=true&characterEncoding=utf8&useSSL=false
                username: root
                password: root
            sharding:
              tables:
                #scs_product可以任意命名,sql中一致,为了方便理解,这里一般写分表共有的
                # 比如我的scs_product_1  和 scs_product_2  那就写scs_product好区分
                # 当执行sql中出现scs_product,sharding-jdbc会将其操作到对应的表
                scs_product:
                  actual-data-nodes: db1.scs_product_$->{1..2}
                  # 指定主键生成策略为雪花id,全局主键
                  key-generator:
                    column: PRODUCT_ID
                    type: SNOWFLAKE
                  #指定scs_product表的分片策略,  分片键和分片算法 用于计算真正的表名
                  table-strategy:
                    inline:
                      # 偶数进到scs_product_1  奇数进到scs_product_2
                      # 对于根据分片字段为条件的,会先判断是否涉及两张表,
                      # 如何是两张表则会两个表都查,如果只涉及单表,则只查询一张表。
                      algorithm-expression: scs_product_$->{PRODUCT_ID % 2 + 1}
                      # 指定分片键为PRODUCT_ID
                      sharding-column: PRODUCT_ID
        

        2.3 dao层

        ShardingMapper.java
        
        @Mapper
        public interface ShardingMapper {
            void insertProduct(@Param("scsProduct") ScsProduct scsProduct);
            List selectProduct();
            //根据id列表查询商品
            List selectProductByIds(@Param("ids") List ids);
        }
        

        2.4 对应的mybatis的xml文件

        
        
        
          
            
            
            
            
            
          
          
            insert into scs_product (PRODUCT_CODE, PRODUCT_NAME, PRODUCT_AMOUNT)
            values (#{scsProduct.productCode, jdbcType=VARCHAR}, #{scsProduct.productName, jdbcType=VARCHAR}, #{scsProduct.productAmount, jdbcType=INTEGER})
          
          
          
        
        

        2.5 Service层

        ShardingService.java
        
        public interface ShardingService {
            void insertProduct(ScsProduct scsProduct);
            List queryProduct();
            PageInfo queryProductPage();
            List queryProductByIds(List ids);
        }
        
        ShardingServiceImpl.java
        
        @Service
        public class ShardingServiceImpl implements ShardingService {
            @Resource
            private ShardingMapper shardingMapper;
            @Override
            @Async(value = "taskThread")
        //    @Transactional(rollbackFor = {TRANSACTION_REQUIRED.class})
            public void insertProduct(ScsProduct scsProduct) {
                scsProduct.setProductName("小商品系列-sharding-jdbc"+Thread.currentThread().getName());
                shardingMapper.insertProduct(scsProduct);
            }
            @Override
            public List queryProduct() {
                return shardingMapper.selectProduct();
            }
            @Override
            public PageInfo queryProductPage() {
                Integer pageIndex = 1;
                Integer pageSize = 15;
                PageHelper.startPage(pageIndex,pageSize);
                List scsProductList = shardingMapper.selectProduct();
                return new PageInfo<>(scsProductList);
            }
            @Override
            public List queryProductByIds(List ids) {
                return shardingMapper.selectProductByIds(ids);
            }
        }
        

        2.6 pojo

        package com.test.sharding.domain.pojo;
        import lombok.Data;
        import java.math.BigInteger;
        @Data
        public class ScsProduct {
            /**
            * 商品主键id
            */
            private Long productId;
            /**
            * 商品编码
            */
            private String productCode;
            /**
            * 商品名称
            */
            private String productName;
            /**
            * 商品库存
            */
            private Integer productAmount;
        }
        

        2.7 controller

        @RestController
        @RequestMapping("/shardingJdbcController")
        @Slf4j
        public class ShardingJdbcController {
            @Resource
            private ShardingService shardingService;
            @PostMapping("/insertProduct")
            @CrossOrigin
            public String insertProduct(){
                ScsProduct scsProduct = new ScsProduct();
                for(int i = 1 ; i < 10 ; i++){
                    scsProduct.setProductAmount(i);
                    scsProduct.setProductCode("SHARDING-JDBC"+i);
                    shardingService.insertProduct(scsProduct);
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
                return "插入成功!";
            }
            @PostMapping("/queryProduct")
            @CrossOrigin
            public List queryProduct(){
                return shardingService.queryProduct();
            }
            @PostMapping("/queryProductPage")
            @CrossOrigin
            public PageInfo queryProductPage(){
                return shardingService.queryProductPage();
            }
        }
        

        2.8 多线程配置

        @Configuration
        @EnableAsync
        public class ThreadPoolConfig {
            @Bean(value = "taskThread")
            public ThreadPoolTaskExecutor taskThread(){
                ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
                executor.setCorePoolSize(12);
                executor.setMaxPoolSize(100);
                executor.setQueueCapacity(100);
                executor.setThreadNamePrefix("taskExecutor-product");
        //        executor.setKeepAliveSeconds(1000);
                executor.initialize();
                return executor;
            }
        }
        

转载请注明来自码农世界,本文标题:《SpringBoot集成Sharding-jdbc(水平分表)》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,148人围观)参与讨论

还没有评论,来说两句吧...

Top