在mybatis-plus+hikari基础上使用sharing-sphere进行单库分表

业务需求:

  • 我们有一个大的文档表,内包含用户id和企业id,考虑到后续数据量较大,现在需要对其进行分表。
  • 要求:每个企业一张表

团队想到的方案:

  1. 使用mybatis-plus的动态表名插件(对原有代码有侵入,如果是xml写的sql,侵入更大)
  2. sharing-sphere中间件(无侵入,改动较小,只需要配置相关分片算法即可)

最终方案:

  • 使用 sharing-sphere中间件

pom依赖

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.1.1</version>
</dependency>
 <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>

sharing-sphere配置

spring:
  shardingsphere:
    props:
      sql:
        # 打印sql
        show: true
    datasource:
      names: ds0
      ds0:
        jdbc-url: jdbc:mysql://192.168.111.37:3306/edniutrans_cloud?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
        username: root
        password: 123456
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
    sharding:
      # 数据分片规则配置
      tables:
        # 逻辑表名称
        document_trans:
          # 由数据源名 + 表名组成(参考 Inline 语法规则)
          # actual-data-nodes: ds0.document_trans_? (?代表任意)
          actual-data-nodes: ds0.document_trans_?
          # 分表策略
          table-strategy:
            # 用于单分片键的标准分片场景
            standard:
              # 自定义分片算法实现类
              precise-algorithm-class-name: com.niutrans.vip.document.business.algorithm.table.MyTableStandardPreciseAlgorithm
              # 分片列名称
              sharding-column: enterprise_id

自定义分片实现类

public class MyTableStandardPreciseAlgorithm implements PreciseShardingAlgorithm<Integer> {
    
    
    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<Integer> preciseShardingValue) {
    
    
        return preciseShardingValue.getLogicTableName() + "_" +  preciseShardingValue.getValue();
    }
}

使用时注意事项

使用shardingsphere分表后,如何正确使用xml实体映射和mp提供的api

补充:Hikari连接池配置

## 数据库配置
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username = root
spring.datasource.password = root

##  Hikari 连接池配置 ------ 详细配置请访问:https://github.com/brettwooldridge/HikariCP
# 连接池中允许的最小连接数。缺省值:10
spring.datasource.hikari.minimum-idle=10
# 连接池中允许的最大连接数。缺省值:10
spring.datasource.hikari.maximum-pool-size=100
# 自动提交
spring.datasource.hikari.auto-commit=true
# 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
spring.datasource.hikari.idle-timeout=30000
# 连接池名字
spring.datasource.hikari.pool-name=FlyduckHikariCP
# 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒
spring.datasource.hikari.max-lifetime=1800000
# 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒
spring.datasource.hikari.connection-timeout=30000
# 数据库连接测试语句
spring.datasource.hikari.connection-test-query=SELECT 1**

猜你喜欢

转载自blog.csdn.net/weixin_43702146/article/details/129120910