• Sharding JDBC整合SpringBoot 2.x 和 MyBatis Plus 进行分库分表


    Sharding JDBC整合SpringBoot 2.x 和 MyBatis Plus 进行分库分表

    交易所流水表的单表数据量已经过亿,选用Sharding-JDBC进行分库分表。MyBatis-Plus和MyBatis的整合方式完全一样,因此需要整合MyBatis的也可参考。采用Sharding-JDBC
    作为分表插件的原因是配置方便,只需要添加Maven依赖导入Jar包而不需要中间件,且对业务代码无侵入。目前在实际业务中用的是单库多表,将交易流水表分成了100张。

    配置经过生产环境的检验,亲测可用。

    分库分表相关的pom文件如下:

    <!-- 提供mysql驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    
    <!--mybatis-plus自动的维护了mybatis以及mybatis-spring的依赖,
                 在springboot中这三者不能同时的出现,避免版本的冲突-->
    
    <!--MyBatis-Plus相关依赖-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.0.1</version>
    </dependency>
    
    <!--如果整合MyBatis而不是MyBatis-Plus,用这个依赖-->
    <!--<dependency>-->
    <!--<groupId>org.mybatis.spring.boot</groupId>-->
    <!--<artifactId>mybatis-spring-boot-starter</artifactId>-->
    <!--<version>2.0.1</version>-->
    <!--</dependency>-->
    
    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        <version>4.0.0-RC2</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-namespace</artifactId>
        <version>4.0.0-RC2</version>
    </dependency>
    

    SpringBoot配置文件如下:

    spring:
      shardingsphere:
        datasource:
    #      数据库名称,可自定义,可以为多个
    #      names: ds0,ds1
          names: ds0
          ds0:
    #        采用的数据库连接池
            type: com.zaxxer.hikari.HikariDataSource
    #        JDBC连接Mysql6 com.mysql.cj.jdbc.Driver时,需要指定时区serverTimezone,若采用com.mysql.jdbc.Driver则无需指定
            driver-class-name: com.mysql.cj.jdbc.Driver
    #        url是数据库的 JDBC URL,而jdbc-url是用来创建连接的 JDBC URL。Hikari没有url属性,所以这里用jdbc-url
            jdbc-url: jdbc:mysql://10.10.10.101:3306/transaction?&autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Hongkong
            username: 昼屿
            password: 昼屿
    
        sharding:
          tables:
    #      需要进行分表的逻辑表名,用MyBatis或者MyBatis-Plus操作数据库时只需要操作逻辑表即可,xml文件也只需要配置逻辑表
            tranasction:
    #        实际的表结点,分了100个表,表名为tranasction0-tranasction99,
              actual-data-nodes: ds0.tranasction$->{0..99}
    #          分表策略
              table-strategy:
    #          主键生成策略,这里采用的是Sharding默认的雪花算法作为分布式唯一id算法
                key-generator:
                  column: id
                  type: SNOWFLAKE
    #            分表策略,我在交易流水表这选择的策略是根据用户id分表,可以结合具体业务,根据时间分表或者根据其他参数分表
                inline:
                  sharding-column: uid
                  algorithm-expression: tranasction$->{uid % 100}
    
        props:
    #      是否打印逻辑SQL语句和实际SQL语句,建议调试时打印,在生产环境关闭
          sql:
            show: true
    
    #MyBatis-Plus的相关配置,如果采用MyBatis可以忽略此部分
    mybatis-plus:
      # 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/com.exchange.mapper/*Mapper.com.exchange.mapper
      # 如果是放在resource目录 classpath:/com.exchange.mapper/*Mapper.com.exchange.mapper
      mapper-locations: classpath:/mapper/*.xml
      #实体扫描,多个package用逗号或者分号分隔
      typeAliasesPackage: com.exchange.yourpackage.entity
      global-config:
        #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
        #若采用雪花算法生成id,需要在生成的实体类中将id的type = IdType.AUTO去掉
        id-type: 0
        #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
        field-strategy: 2
        #驼峰下划线转换
        db-column-underline: true
        #刷新mapper 调试神器
        #refresh-mapper: true
        #数据库大写下划线转换
        #capital-mode: true
        # Sequence序列接口实现类配置
        #逻辑删除配置(下面3个配置)
        logic-delete-value: Y
        logic-not-delete-value: N
        #sql-injector: com.nky.pork.quality.standard.conf.MybatisPlusConfig
        configuration:
          #配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId)
          map-underscore-to-camel-case: true
          cache-enabled: false
          #配置JdbcTypeForNull, oracle数据库必须配置
          jdbc-type-for-null: 'null'
    
    #是否输出Mybatis-Plus代执行的SQL语句
    logging:
      level:
        com.exchange.yourpackage.dao: trace
    
    server:
      port: 6666
      servlet:
        context-path: /zhouYu
    

    Sharding JDBC对业务代码时无侵入的,只需要用未分库分表前对实体表的操作方法,来操作分库分表后的逻辑表即可。也可完美兼容PageInfo插件进行分页。

  • 相关阅读:
    开发ProxyServer的时候如何在一台PC上调试
    eclipse使用replace命令替换整个project/workspace的某个字符串
    android程序获取WIFI的IP地址和MAC地址
    将web项目deploy到tomcat的方法
    Windows下搭建Android开发环境
    解决:并排的两个div底部对齐
    eclipse调试jsp中的scriptlet代码
    棋盘覆盖(递归分治问题)
    Java中sleep()和wait()的区别
    Random()方法的使用
  • 原文地址:https://www.cnblogs.com/bestJavaCoding/p/11779478.html
Copyright © 2020-2023  润新知