spring-boot集成mybait-plus+shareding实现分表分库,dynamic动态数据多数据源

news2024/11/17 21:18:55

spring-boot集成mybait-plus+shareding实现分表分库,多数据源

  • 1. Spring-boot集成shareding + Mybatis-plus
    • 依赖引用
    • yaml 配置
    • 示例
  • 2. 引用 dynamic实现分表+动态数据源
    • 依赖引用
    • yaml配置
    • 数据源注入配置
    • 示例

说明: 以下内容为两部分:
           1、springboot+shareding+mybatis-plus 集成接入单库,进行分表查询,等操作
           2、在springboot+shareding+mybatis-plus 集成接入单库,进行分表查询的基础上,增加dynamic动态数据源依赖,接入动态多数据源
           即:shareding分表的数据源 1个 ,需要操作的其他数据源(不进行分表)的数据源 1个

若是集成shareding的基础上进行分表分库(即shareding分表的数据源多个),或者是多数据源的基础上,再进行多库分表分库的(即shareding分表数据源多个 + 其他不分表的动态数据源),可以跳过,暂时未研究

1. Spring-boot集成shareding + Mybatis-plus

  • 依赖引用

           依赖包引用尽量能用最新的就用最新的,能使用spring-boot集成过的就使用集成过的,没必要一个项目引用多版本,导致某些莫名奇妙的问题

     <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.7.RELEASE</version>
     </parent>
     <!-- spring boot版本-->
     <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.7.RELEASE</version>
                <type>pom</type>
            </dependency>
        </dependencies>
      </dependencyManagement>
    
       <dependency><!-- mybatis-plus依赖器 -->
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
       </dependency>
       <dependency><!-- 继承spring-boot中的版本 -->
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
       </dependency>
       <dependency>
          <groupId>org.apache.shardingsphere</groupId>
           <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
           <version>4.1.1</version>
       </dependency>
       <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.16</version>
        </dependency>
    	<dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-core-common</artifactId>
            <version>4.1.1</version>
        </dependency>
    
  • yaml 配置

    
    spring:
      main:
        allow-bean-definition-overriding: true
      shardingsphere:
        datasource:
          names: ds01
          ds01:
            type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: com.mysql.jdbc.Driver
            url: jdbc:mysql://xxxxx?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=UTC
            username: xxxx
            password: xxx
        props:
          sql:
            show:true
        sharding:
          tables:
            #分表数据表找寻规则配置
            t_order:
              #分表策略,同分库策略
              key-generator:
                column: user_id
                type: SNOWFLAKE
              actual-data-nodes: ds01.t_order_$->{0..19}
              # 指定分片策略 约定id值除20取余
              table-strategy:
                inline:
                  sharding-column: user_id
                  algorithm-expression: t_order_$->{user_id % 20}
    #Sharding Sphere 不支持数据库健康检查,关闭actuate 的数据库健康检查即可启动不会报错
    management:
      health:
        db:
          enabled: false 
    		
    #mybatis配置
    mybatis-plus:
      mapper-locations:
        - classpath*:mapper/**/*.xml
      global-config:
        #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
        id-type: 0
        #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
        field-strategy: 1
        #驼峰下划线转换
        db-column-underline: true
        #刷新mapper 调试神器
        refresh-mapper: true
        #数据库大写下划线转换
        #capital-mode: true
        #序列接口实现类配置
        #key-generator: com.baomidou.springboot.xxx
        #逻辑删除配置
        logic-delete-value: 1
        logic-not-delete-value: 0
      configuration:
        map-underscore-to-camel-case: true
        cache-enabled: false
        call-setters-on-nulls: true
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl		
    
  • 示例

           pom依赖引入好了之后,配置好mybatis-plus相关配置,以及mapper映射等。使用mybatis提供的generator代码生成器生成文件,手敲也行。
    注意: @TableName中的表名与数据库保持一致即可,无需后面添加_f,否则会报错,如下图2可以看到,框架自动给我们根据分表字段,计算好的要查询的表。

           这里贴出查看Mysql执行记录的查询语句,大家可以自己验证

    SET GLOBAL log_output = 'TABLE'; SET GLOBAL general_log = 'ON';  
    select a.*,convert(argument using utf8) from mysql.general_log a where a.argument LIKE '%c_doudian_pdd_order%' order by event_time desc;
    
    SET GLOBAL log_output = 'TABLE'; SET GLOBAL general_log = 'OFF'; 
    

    在这里插入图片描述
    在这里插入图片描述

2. 引用 dynamic实现分表+动态数据源

  • 依赖引用

           在第一步的基础上,增加 dynamic-datasource-spring-boot-starter 依赖,这里引用3.6.1版本,如果是使用的3.3左右版本的,下面步骤中,会给出3.3左右版本的注入实例方式

     <dependency>
         <groupId>com.baomidou</groupId>
         <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
         <version>3.6.1</version>
     </dependency>
    
    
  • yaml配置

    在第一步配置的基础上,增加动态数据源配置即可
    配置示例

    spring:
      main:
        allow-bean-definition-overriding: true
      shardingsphere:
        datasource:
          names: ds01
          ds01:
            type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: com.mysql.jdbc.Driver
            url: jdbc:mysql://xxxxx?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=UTC
            username: xxxx
            password: xxx
        props:
          sql:
            show:true
        sharding:
          tables:
            #分表数据表找寻规则配置
            t_order:
              #分表策略,同分库策略
              key-generator:
                column: user_id
                type: SNOWFLAKE
              actual-data-nodes: ds01.t_order_$->{0..19}
              # 指定分片策略 约定id值除20取余
              table-strategy:
                inline:
                  sharding-column: user_id
                  algorithm-expression: t_order_$->{user_id % 20}		
      datasource:
        dynamic: # 未分库分表的动态数据源配置
          primary: ds01 #设置默认的数据源或者数据源组,默认值即为master
          strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
          datasource:
            ds02:
              type: com.alibaba.druid.pool.DruidDataSource
              driver-class-name: com.mysql.jdbc.Driver
              url: jdbc:mysql://xxxxxx/xx?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=UTC
              username: xx
              password: xxxx
    
  • 数据源注入配置

    以下是引用3.6.1版本的注入方式

    @Configuration
    @AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class,
            SpringBootConfiguration.class})
    public class DataSourceConfiguration {
    
        /**
         * 分表数据源名称
         */
        private static final String SHARDING_DATA_SOURCE_NAME = "ds01";
    
        /**
         * 动态数据源配置项
         */
        @Resource
        private DynamicDataSourceProperties properties;
    
        /**
         * shardingjdbc有四种数据源,需要根据业务注入不同的数据源
         *
         * <p>1. 未使用分片, 脱敏的名称(默认): shardingDataSource;
         * <p>2. 主从数据源: masterSlaveDataSource;
         * <p>3. 脱敏数据源:encryptDataSource;
         * <p>4. 影子数据源:shadowDataSource
         */
        @Lazy
        @Resource
        DataSource shardingDataSource;
    
        /**
         * 将动态数据源设置为首选的
         * 当spring存在多个数据源时, 自动注入的是首选的对象
         * 设置为主要的数据源之后,就可以支持shardingjdbc原生的配置方式了
         *
         * @return
         */
        @Primary
        @Bean
        public DataSource dataSource() {
            DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
            dataSource.setPrimary(properties.getPrimary());
            dataSource.setStrict(properties.getStrict());
            dataSource.setStrategy(properties.getStrategy());
            dataSource.addDataSource(SHARDING_DATA_SOURCE_NAME, shardingDataSource);
            dataSource.setP6spy(properties.getP6spy());
            dataSource.setSeata(properties.getSeata());
            return dataSource;
        }
    }	
    

    如果依赖引用的是 3.3.2左右的版本DataSource 注入时,变更一下即可,如下

    @Configuration
    @AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class,
            SpringBootConfiguration.class})
    public class DataSourceConfiguration {
    
        /**
         * 分表数据源名称
         */
        private static final String SHARDING_DATA_SOURCE_NAME = "ds01";
    
        /**
         * 动态数据源配置项
         */
        @Resource
        private DynamicDataSourceProperties properties;
    
        /**
         * shardingjdbc有四种数据源,需要根据业务注入不同的数据源
         *
         * <p>1. 未使用分片, 脱敏的名称(默认): shardingDataSource;
         * <p>2. 主从数据源: masterSlaveDataSource;
         * <p>3. 脱敏数据源:encryptDataSource;
         * <p>4. 影子数据源:shadowDataSource
         */
        @Lazy
        @Resource
        DataSource shardingDataSource;
    
        @Bean
        public DynamicDataSourceProvider dynamicDataSourceProvider() {
            final 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;
                }
            };
        }
    
        /**
         * 将动态数据源设置为首选的
         * 当spring存在多个数据源时, 自动注入的是首选的对象
         * 设置为主要的数据源之后,就可以支持shardingjdbc原生的配置方式了
         *
         * @return
         */
        @Primary
        @Bean
        public DataSource dataSource() {
            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;
        }
    }
    
    
  • 示例

           按照以上配置,配置完成既可,在所需要的服务层上加上@DS注解,指定访问副数据源,未指定则会访问默认的主数据源,主数据源具体是哪个,在yaml配置中dynamic.primary属性指定主数据源即可

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1390344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑马苍穹外卖学习Day7

文章目录 缓存菜品实现思路代码开发 缓存套餐Spring Cache入门案例实现思路代码开发 添加购物车需求分析和设计代码开发 查看购物车需求分析代码开发 清空购物车需求分析代码实现 缓存菜品 实现思路 代码开发 Controller层 RestController("userDishController") …

C# new Thread和Task.Run,多线程(Thread和Task)

一、开启多线程-new Thread的使用 示例一 Thread thread25yi new Thread(new ThreadStart(obj.MethodTimer1)); thread25yi.Start(); void MethodTimer1() { while (true) { Console.WriteLine(DateTime.Now.ToString() "_" thread25yi.CurrentThread.Managed…

Github搭建图床 github搭建静态资源库 免费CDN加速 github搭建图床使用 jsdelivr CDN免费加速访问

Github搭建图床 github搭建静态资源库 免费CDN加速 github搭建图床使用 jsdelivr CDN免费加速访问 前言1、创建仓库2、开启 gh-pages页面功能3、访问测试 前言 写博客文章时&#xff0c;图片的上传和存放是一个问题&#xff0c;使用小众第三方图床&#xff0c;怕不稳定和倒闭&…

【SpringMVC】常用注解(续)

在SpringMVC常用注解一文中&#xff0c;已经对一些基本注解&#xff08;有Controller、RequestMapping、ResponseBody、RequestParam&#xff09;进行了简单介绍&#xff1b;在此篇文章中&#xff0c;将继续对剩余的几个常用注解进行简单介绍&#xff0c;有RequestBody、PathVa…

测试平台出问题?看我20分钟快速定位!

今天遇到一个问题&#xff0c;感觉挺有意思&#xff0c;处理过程也非常有意义&#xff0c;希望能给大家一个借鉴吧。今天一位小姐姐找到了我们大组长&#xff0c;说测试平台添加自动化测试用例失败&#xff0c;之后我们组长把我拉到了一个群里让我去看一下&#xff0c;硬着头皮…

uniapp 简易自定义日历

1、组件代码 gy-calendar-self.vue <template><view class"calendar"><view class"selsct-date">请选择预约日期</view><!-- 日历头部&#xff0c;显示星期 --><view class"weekdays"><view v-for"…

k8s存储卷-动态PV

pv和PVC&#xff0c;存储卷&#xff1a; 存储卷&#xff1a; EmptyDir&#xff1a;容器内部&#xff0c;随着pod销毁&#xff0c;emptyDir也会消失&#xff0c;不能做数据持久化 HostPath&#xff1a;持久化存储数据&#xff0c;可以和节点上目录做挂载&#xff0c;pod被销毁…

vue el-table 多选框回填

主要代码: //选中列&#xff0c;所有列&#xff0c;表名toggleSelection(selectRows, totalRows, tablename) {this.$refs.table.clearSelection();if (selectRows.length > 0) {this.$nextTick(() > {selectRows.forEach(item > {totalRows.forEach(item1 > {if (…

PyTorch常用操作

0. 先决条件 安装驱动、CUDA、cuDNN&#xff0c;请参考&#xff1a;https://blog.csdn.net/liugan528/article/details/128974129 import torch print(torch.__version__)#查看gpu是否可用 print(torch.cuda.is_available())#查看设备gpu个数 print(torch.cuda.device_count(…

数据结构学习 jz29 顺时针打印矩阵

关键词&#xff1a;模拟 题目&#xff1a;螺旋遍历二维数组 简单题做了超过40分钟 调了很久 不好 方法一&#xff1a; 我自己做的。 思路&#xff1a; xy_t&#xff1a; 记录xy的方向&#xff0c;往右走&#xff0c;往下走&#xff0c;往左走&#xff0c;往上走 t控制方…

Jupyter Notebook

2017年左右在大学里都听说过Jupyter Notebook&#xff0c;并且也安装用了一段时间&#xff0c;后来不知道什么原因没有用了。估计是那时候写代码的时候多一些&#xff0c;因为它可以直接写代码并运行结果&#xff0c;现在不怎么写代码了。 介绍 后缀名为.ipynb的json格式文件…

105、Zero-1-to-3: Zero-shot One Image to 3D Object

简介 官网  使用合成数据集来学习相对摄像机视点的控制&#xff0c;这允许在指定的摄像机变换下生成相同对象的新图像&#xff0c;用于从单个图像进行三维重建的任务。 实现流程 输入图像 x ∈ R H W 3 x \in \R^{H \times W \times 3} x∈RHW3&#xff0c;所需视点的相…

PyTorch——torchtext与PyTorch匹配的版本

一、匹配版本的对照表 二、按照对应版本的命令 例子&#xff1a; pip install torchtext0.9.1参考资料&#xff1a; Torchtext and PyTorch s Version Compatibility

云联惠 被查 消费积分合法化!——全新消费返利模式!共享购!

大家好 我是吴军 一家软件开发公司的产品经理 今天讲一讲&#xff0c;曾经盛极一时的云联惠&#xff0c;巅峰时期达到一千万的用户&#xff0c;资金6000亿。 前几年云联惠如火如荼&#xff0c;到处都是在宣传云联惠的&#xff0c;小编也略玩了一下下。 当时因为政策的不明朗…

SpringBoot:详解依赖注入和使用配置文件

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、&#x1f3…

【软件工程】《软件工程》期末复习提纲

《软件工程》期末复习提纲 第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 第九章 第十章 第十一章 第十二章 第十三章 第十四章 小题参考 大题参考 《软件工程》期末复习提纲 第一章 1.在下列选项中&#xff0c;&#xff08; &#xff09;不是软…

10.9.2 std::function 代替函数指针 Page182~183

std::function是一个模板类&#xff0c;基本可作为函数指针的代替品&#xff0c;具备更多功能&#xff0c;特别是与函数对象及bind配合使用。使用std::function时&#xff0c;需要添加头文件 #include <functional> 1.定义函数指针 18行&#xff0c;定义了一个函数指针类…

Linux常用命令大全(三)

系统权限 用户组 1. 创建组groupadd 组名 2. 删除组groupdel 组名 3. 查找系统中的组cat /etc/group | grep -n “组名”说明&#xff1a;系统每个组信息都会被存放在/etc/group的文件中1. 创建用户useradd -g 组名 用户名 2. 设置密码passwd 用户名 3. 查找系统账户说明&am…

多模型图像特征可视化

特征图可视化是指将网络中某一层的特征图可视化出来&#xff0c;以便观察网络在不同层次上学到的特征。卷积可视化可以帮助深度学习研究者更好地理解卷积的概念和原理&#xff0c;从而更好地设计和优化卷积神经网络。通过可视化&#xff0c;研究者可以更清晰地看到卷积运算中的…

【现代密码学】笔记 补充7-- CCA安全与认证加密《introduction to modern cryphtography》

【现代密码学】笔记7-- CCA安全与认证加密《introduction to modern cryphtography》 写在最前面7 CCA安全与认证加密 写在最前面 主要在 哈工大密码学课程 张宇老师课件 的基础上学习记录笔记。 内容补充&#xff1a;骆婷老师的PPT 《introduction to modern cryphtography》…