springboot动态数据源用shardingjdbc按时间分表

2023-11-06

1、背景:

    原有项目架构 

  • springboot

  • mybatis-plus 

  • dynamic-datasource(动态数据源、mybatis-plus拓展)

  • druid 连接池

    根据业务数据不断增加,需要进行对业务量大的数据表行分表,因为以前的业务都是动态数据源管理datasource,改造可以顺势而为,把shardingjdbc的数据源也交给

dynamic-datasource 来管理,默认走以前不分表的逻辑,并且不由sharding管理,兼容以前逻辑,这里shardingjdbc有不兼容的sql情况,不分表的部分可以规避此风险。

2、必要的pom依赖:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
    <relativePath/>
</parent>


<properties>
      <mybatis-plus.version>3.1.2</mybatis-plus.version>
      <druid.version>1.1.17</druid.version>
  </properties>

<!-- mybatis-plus -->
<dependency>
       <groupId>com.baomidou</groupId>
       <artifactId>mybatis-plus-boot-starter</artifactId>
       <version>${mybatis-plus.version}</version>
   </dependency>
<!-- druid -->
     <dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>${druid.version}</version>
</dependency>
<!-- 动态数据源 -->
<dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
   <version>3.1.1</version>
</dependency>
<dependency>
   <groupId>org.apache.shardingsphere</groupId>
   <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
   <version>4.1.0</version>
</dependency>

3、yml相关配置

spring:
  shardingsphere:
    datasource:
      names: ds0
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://xx:3306/xx?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
        username: xx
        password: xx
    sharding:
      tables:
        table1:
          actualDataNodes: ds0.table1_${202107..202112}
          tableStrategy:
            standard:
              shardingColumn: create_time
              #精确分片算法类名称,用于=和IN。。该类需实现 PreciseShardingAlgorithm 接口并提供无参数的构造器
              preciseAlgorithmClassName: org.jeecg.config.sharding.DatabaseShardingAlgorithm
              #范围分片算法类名称,用于BETWEEN,可选。。该类需实现RangeShardingAlgorithm接口并提供无参数的构造器
          keyGenerator:
            type: SNOWFLAKE
            column: id
  datasource:
      druid:
    stat-view-servlet:
      enabled: true
      loginUsername: admin
      loginPassword: 123456
      allow:
    web-stat-filter:
      enabled: true
  dynamic:
    druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)
      # 连接池的配置信息
      # 初始化大小,最小,最大
      initial-size: 5
      min-idle: 5
      maxActive: 20
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      # 打开PSCache,并且指定每个连接上PSCache的大小
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      filters: stat,wall,slf4j
      # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
    datasource:
      master:
        url: jdbc:mysql://xx:3306/xx?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
        username: xx
        password: xx
        driver-class-name: com.mysql.jdbc.Driver
      # 多数据源配置
      multi-datasource1:
        url: jdbc:mysql://xx:3306/xx1?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
        username: xx
        password: xx
        driver-class-name: com.mysql.jdbc.Driver

格式需要自己调整一下对齐,以上配置是 原有dynamic 相关、sharding相关是拓展添加

4、分表算法逻辑(org.jeecg.config.sharding.DatabaseShardingAlgorithm)

package org.jeecg.config.sharding;


import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;


import java.util.Collection;
import java.util.Date;




public class DatabaseShardingAlgorithm implements PreciseShardingAlgorithm<Date> {
    @Override
    public String doSharding(Collection<String> collection, PreciseShardingValue<Date> preciseShardingValue) {
       String db_name=preciseShardingValue.getLogicTableName();
       try {
         Date date = preciseShardingValue.getValue();
         String year = String.format("%tY", date);
         String mon  = String.format("%tm",date);
         db_name=db_name+"_"+year+mon;
         System.out.println("db_name:" + db_name);
   } catch (Exception e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
   }
       
       for (String each : collection) {
           System.out.println("db:" + each);
           if (each.equals(db_name)) {
                return each;
            }
        }
       
       throw new IllegalArgumentException();
    }
}

5、sharding数据源加入到动态数据源里

package org.jeecg.common.config;


import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider;
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import org.apache.shardingsphere.shardingjdbc.jdbc.adapter.AbstractDataSourceAdapter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;


import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.Map;


/**
* 动态数据源配置:
*
* 使用{@link com.baomidou.dynamic.datasource.annotation.DS}注解,切换数据源
*
* <code>@DS(DataSourceConfiguration.SHARDING_DATA_SOURCE_NAME)</code>
*
* @author lixiaoyi
*/
@Configuration
@AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class,
        SpringBootConfiguration.class})
public class DataSourceConfiguration {
    /**
     * 分表数据源名称
     */
    private static final String SHARDING_DATA_SOURCE_NAME = "gits_sharding";
    /**
     * 动态数据源配置项
     */
    @Autowired
    private DynamicDataSourceProperties properties;


    /**
     * shardingjdbc有四种数据源,需要根据业务注入不同的数据源
     *
     * <p>1. 未使用分片, 脱敏的名称(默认): shardingDataSource;
     * <p>2. 主从数据源: masterSlaveDataSource;
     * <p>3. 脱敏数据源:encryptDataSource;
     * <p>4. 影子数据源:shadowDataSource
     *
     */
    @Lazy
    @Resource(name = "shardingDataSource")
    AbstractDataSourceAdapter shardingDataSource;


    @Bean
    public DynamicDataSourceProvider dynamicDataSourceProvider() {
        Map<String, DataSourceProperty> datasourceMap = properties.getDatasource();
        return new AbstractDataSourceProvider() {
            @Override
            public Map<String, DataSource> loadDataSources() {
                Map<String, DataSource> dataSourceMap = createDataSourceMap(datasourceMap);
                // 将 shardingjdbc 管理的数据源也交给动态数据源管理
                dataSourceMap.put(SHARDING_DATA_SOURCE_NAME, shardingDataSource);
                return dataSourceMap;
            }
        };
    }


    /**
     * 将动态数据源设置为首选的 (此处可以不注入 此对象 因为配置里已经表明了primary数据源)
     * 当spring存在多个数据源时, 自动注入的是首选的对象
     * 设置为主要的数据源之后,就可以支持shardingjdbc原生的配置方式了
     *
     * @return
     */
    @Primary
    @Bean
    public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) {
        DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
        dataSource.setPrimary(properties.getPrimary());
        dataSource.setStrict(properties.getStrict());
        dataSource.setStrategy(properties.getStrategy());
        dataSource.setProvider(dynamicDataSourceProvider);
        dataSource.setP6spy(properties.getP6spy());
        dataSource.setSeata(properties.getSeata());
        return dataSource;
    }
}

6、使用

@Service
@DS("gits_sharding")
public class TestServiceImpl{
}

可以在相关service使用@DS 去改变数据源 ,@DS是mybatis-plus 拓展的 dynamic-datasource 相关用法 这里就不展开说明了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot动态数据源用shardingjdbc按时间分表 的相关文章

随机推荐

  • 经典面试题-聊聊JDK和CGLib动态代理实现和区别

    前言 在电面试阿里时 被问到Spring AOP中JDK和CGLib动态代理的区别 在此整理一下 供大家参考 JDK和CGLib动态代理实现 动态代理在Java中有着广泛的应用 如Spring AOP Hibernate数据查询 测试框架的
  • ZeroTier与Windows远程桌面实现远程控制 (转)(内网穿透)

    背景 Teamviewer虽然很好用速度也快 但是它是一款商业软件 时常会检测为商业用途而阻止个人免费使用 虽然网上也有一些修改ID的方法 还是各种破解版 但是均不尽如人意 于是想找找替代方案 经过尝试发现ZeroTier与Windows远
  • springMVC解决中文乱码几种方式,以及使用fastJSOn调整时间 的格式

    为什么 ResponseBody向前台传JSON输数据会有乱码 首先要知道乱码的原因是在入参之前就应经决定的 就是springMVC 中HandlerMapping会找到对应的handel 即具体去处理请求的方法 但是请注意 在真正调用处理
  • 三个短视频APP开发的成功秘诀免费发放

    无论海内外 中国的短视频已然走向了世界 成为世界了解中国的一种方式 甚至连Facebook都暗搓搓得准备 抄袭 抖音啃一块市场份额的蛋糕 更有无数的短视频APP开发者投入到这块市场中来 想要一战成名 这么 如何进行短视频开发 才能笑到最后呢
  • openwrt挂载tf卡,提示“unknown filesystem type 'vfat'”

    用命令挂载tf卡的时候报错 mount mnt mmcblk0p1 unknown filesystem type ext2 开始还以为是tf卡格式的问题 换了ext4和fat 仍然是这样 mount mnt mmcblk0p1 unkno
  • 在Qt中使用LoadLibrary无法加载DLL

    Qt系列文章目录 文章目录 Qt系列文章目录 前言 一 问题分析 前言 最近因项目需要使用qt做开发 之前使用LoadLibrary加载dll成功 很庆幸 当一切都那么顺风顺水的时候 测试同事却发现 在windows平台上个别电脑上加载dl
  • Python+xlwings操作Excel实战

    Excel是全世界最普及最强大的办公软件 应该没有之一 excel就相当于是一只老虎 python相当于是一双翅膀 两者结合将产生 如虎添翼 的效果 好了 不卖关子了 今天我们要跟大家说到的是excel xlwings xlwings是一个
  • 数据库架构演变过程

    背景 在互联网初创时期 企业往往采用单体架构去搭建自己的应用系统 但是 随着企业的不断壮大 系统访问量不断随之上升 数据量也急剧增长 数据的存储是首先要解决的问题 在这个大数据时代 数据就是企业的命根子 数据库的单体架构很难满足数据的存储
  • 未能加载基类“DevExpress.XtraEditors.XtraForm”。请确保已引用该程序集并已生成所有项目

    遇到上述问题 在网上查找了一下解决方案 在此记录 https www cnblogs com liyanwei p 4389396 html
  • JavaScript学习三 特殊对象

    数组 什么是数组 数组是一种特殊的对象 和普通对象功能相似都是用来存储值的 但是有一点不同 数组的属性名称为索引 index 从0开始 属性值称为值 数组的增删改查 创建数组 var a new Array 使用字面量 创建 var a1
  • 我给鸿星尔克写了一个720°看鞋展厅

    最近因为鸿星尔克给河南捐了5000万物资 真的是看哭了很多的网友 普通一家公司捐款5000万可能不会有这样的共情 但是看了鸿星尔克的背景之后 发现真的是令人心酸 鸿星尔克2020年的营收是28亿 但是利润却是亏损2个亿 甚至连微博的官方账号
  • 云服务器可以做虚拟主机吗,云服务器可以做虚拟主机吗

    云服务器可以做虚拟主机吗 内容精选 换一换 弹性公网IP申请成功后 将弹性公网IP绑定到弹性云服务器 裸金属服务器 虚拟IP 弹性负载均衡 NAT网关等资源上 可实现与公网的连接 绑定弹性云服务器 裸金属服务器 虚拟IP在 弹性公网IP 界
  • Linux下crontab命令的用法:sudo crontab -l

    cron 是linux系统下一个自动执行指定任务的程序 cron服务是linux的内置服务 但它不会开机自动启动 可以用以下命令启动和停止服务 Linux代码 sbin service crond start sbin service cr
  • android:inputType属性和setInputType()方法参数对应整理

    以密码类型 password 为例 android inputType属性
  • 服务器使用必备条件、操作步骤及实践步骤详解

    一 服务器使用必备条件 1 网络连接 服务器必须具备稳定的网络连接 以便与外部网络进行通信 这通常需要配置正确的网络接口和IP地址 2 硬件配置 服务器的硬件配置包括处理器 内存 存储和I O设备等 需要根据服务器的用途和需求选择合适的硬件
  • fabric1.0之cryptogen讲解

    一 工具定义 Cryptogen是hyperleder fabric提供的为网络实体生成加密材料 公私钥 证书等 的实用程序 简单来说就是一个生成认证证书 x509 certs 的工具 这些证书代表一个身份 并允许在网络实体间通信和交易时进
  • 下拉框控制当一个选中时另一个值随着变化且不可选

    推荐阅读 AI绘画关于SD MJ GPT SDXL百科全书 面试题分享点我直达 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java python面试题 项目实战 AI文本 OCR识别最佳实践 AI Gamma一键
  • 常用的获取日期相关内容的方法

    1 格式化日期的方法 只返回日期 年 月 日 const formateDate val gt const date new Date val const year date getFullYear const month repairZe
  • pycharm利用快捷键,快速注释多行代码的方法分享

    最近在pycharm的新手学习群里 发现有些小伙伴依然在 手工 进行代码的注释 效率较低 下面分享pycharm利用快捷键 快速注释多行代码的方法 可以帮助pycharm初学者加倍提升代码的注释效率 代码注释快捷键 pycharm代码注释的
  • springboot动态数据源用shardingjdbc按时间分表

    1 背景 原有项目架构 springboot mybatis plus dynamic datasource 动态数据源 mybatis plus拓展 druid 连接池 根据业务数据不断增加 需要进行对业务量大的数据表行分表 因为以前的业