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

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.mfbz.cn/a/317312.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WebDav协议相关软件@简单配置局域网内的http和WebDav服务器和传输系统

文章目录 相关软件windows自带第三方软件 chfs(CuteHttpFileServer)下载软件GUI方案 补充命令行方案命令行程序定位简单创建服务站点使用配置文件配置细节 使用软连接或符号链接等手段将向共享站点的根目录添加文件开机自启服务包装nssm包装使用powershell包装 服务启动chfs服务…

安装nvidia driver出现 the cc vision check falied

这里提示说的需要gcc12,但是我只有gcc11,所以就报错了&#xff0c;说一说我自己的解决方法&#xff1a; 安装gcc12和g12,再切换版本为gcc12 安装gcc12: sudo apt install gcc-12安装g12: sudo apt -y install g-12切换版本&#xff1a;参考博客

MSF流量加密

1、背景介绍 在MSF中生成shell&#xff0c;并上线运行时。都是通过http https tcp等协议传输。虽然MSF本身会对流量进行加密&#xff0c;但MSF太出名以致于其加密特征容易被IPS&#xff0c;WAF等可以检测带有攻击的特征的设备拦截或记录。 2、生成 SSL 证书 openssl req -x50…

《ORANGE’S:一个操作系统的实现》读书笔记(二十九)文件系统(四)

上一篇文章完善了硬盘驱动程序&#xff0c;并且完成了一个文件系统。这篇文章开始记录对文件的操作&#xff0c;首先记录如何创建一个文件。 目录 创建文件 Linux 下的文件操作 文件描述符&#xff08;file descriptor&#xff09; open() 创建文件所涉及的其它函数 str…

Redis:原理速成+项目实战——Redis企业级项目实战终结篇(HyperLogLog实现UV统计)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战14&#xff08;BitMap实现用户签到功能&#xff09; &#x1f4da;订阅专栏&am…

vue中使用js-doc

安装依赖 安装vue-template-compiler npm install ​vue-template-compiler​ 安装minami npm install minami 安装js-doc npm install js-doc 根目录下创建 .jsdoc.conf.json 内容&#xff1a; {"tags": {"allowUnknownTags": true,// 指定所用词…

linux环境下安装postgresql

PostgreSQL: Linux downloads (Red Hat family)postgresql官网 PostgreSQL: Linux downloads (Red Hat family) 环境&#xff1a; centos7 postgresql14 选择版本 执行启动命令 配置远程连接文件 vi /var/lib/pqsql/14/data/postgresql.conf 这里将listen_addresses值由lo…

阿里云服务器+宝塔 (尝试部署一个最简单的静态页面)

1. 免费白嫖一个阿里服务器 进入网址&#xff1a;服务器购买地址 选择预装宝塔面板 购买完成后前往控制台 查看当前实例 设置或修改密码 设置用户名和密码 2. 远程连接到服务器 2.1. 使用Workbench连接 输入用户名和密码连接成功页面如下&#xff1a; 2.2. 使…

redis高级篇之单线程和多线程

目录 1、redis的发展史 2、redis为什么选择单线程&#xff1f; 3、主线程和Io线程是怎么协作完成请求处理的&#xff1f; 4、IO多路复用 5、开启redis多线程 1、redis的发展史 Redis4.0之前是用的单线程&#xff0c;4.0以后逐渐支持多线程 Redis4.0之前一直采用单线程的主…

高级分布式系统-第6讲 分布式系统的容错性--可靠的组通信

可靠的组通信 组内通信最好是每个进程之间都建立点到点的通信&#xff0c; 但实际中这样的组织结构不是有效的&#xff0c; 因为会浪费很大的通信带宽。 在平等组中&#xff0c; 多播是主要的组织结构。 但多播是具有同步性质的容错结构&#xff0c; 并不适用拜占庭模型。 多…

Redis命令 - Strings命令组常用命令

1、Set命令 SET key value [EX seconds] [PX milliseconds] [NX|XX]1.1 参数说明&#xff1a; EX seconds: 设置key的过期时间&#xff0c;单位时秒PX milliseconds: 设置key的过期时间&#xff0c;单位时毫秒NX: 只有key不存在的时候&#xff0c;才会设置key的值XX: 只有key…

GitHub注册新账号的操作流程(详细)

目录 第一步 进入官网&#xff0c;点击右上角的"Sign up" 第二步 输入email地址 第三步 设置密码 第四步 输入昵称 第五步 根据个人喜好决定要不要接收GitHub的邮件推送。然后回答他们的验证问题 第六步 输入验证码 我在注册github账号时遇到过一些阻碍&#x…

Web前端 ---- 【Vue3】ref和reactive实现响应式的区别和联系

目录 前言 setup ref 基本数据类型 对象形式 reactive ref和reactive的区别与联系 前言 本文介绍函数ref和函数reactive实现响应式 setup 在介绍ref和reactive之前&#xff0c;先介绍setup,vue3新引入的配置项。在该配置项中&#xff0c;在vue2中的data、methods、comput…

VS游戏打包教程

我用得天天酷跑小游戏做的例子 1:安装打包插件 2:在解决方案里新建一个项目 3:新建一个setup项目 4:界面如下(通过右键folder,可以创建folder目录和输出) 5:素材文件 6:素材放完了就项目输出 7:创建快捷方式 右键这个主输出选择第一个create shortcut 8:将这个快捷方式,拖到,…

MAVROS与机载电脑Jetson nano通信

简介&#xff1a;MAVROS和Jetson nano通信&#xff0c;设置飞控参数和MAVROS文件&#xff0c;实现飞控和机载电脑的通信。MAVROS相当于PX4飞控中的MAVLINK模块。MAVROS将话题转为MAVLINK格式消息发送给飞控&#xff0c;飞控中的MAVLINK模块将MAVLINK格式消息转化为uORB消息给PX…

MYSQL分表分库 详解

目录 一、垂直拆分于水平拆分的区别&#xff1f; 垂直拆分 水平拆分 二、分表分库有哪些策略&#xff1f; Hash分片策略 枚举分片策略 日期分片策略 范围分片策略&#xff08;用的较多&#xff09; 三、分表分库之后&#xff0c;如何查询的呢&#xff1f; 四、分表分…

009集:open( )、write( )、close( )函数读写文件实例—python基础入门实例

一般来说&#xff0c;计算机文件可以分为两类&#xff1a;文本文件和二进制文件。大多数Windows文本文件使用ANSI、OEM或者Unicode编码。常见的文本文件有&#xff1a;大多数Windows文本文件使用ANSI、OEM或者Unicode编码。常用的文本文件格式有ASCII、MIME、*.txt等&#xff0…

【Linux 内核源码分析】进程调度 -CFS 调度器

Linux调度器 Linux内核调度器是负责决定哪个进程在何时执行的组件。它管理着CPU资源的分配和任务的调度&#xff0c;以确保系统资源的合理利用和任务的高效执行。Linux内核中常见的调度器有多种&#xff0c;包括经典的O(1)调度器、CFS&#xff08;Completely Fair Scheduler&a…

大模型实战笔记04——XTuner 大模型单卡低成本微调实战

大模型实战笔记04——XTuner 大模型单卡低成本微调实战 1、Finetune简介 2、XTuner 3、8GB显存玩转LLM 4、动手实战环节 注&#xff1a; 笔记内容均为截图 课程视频地址&#xff1a;https://www.bilibili.com/video/BV1yK4y1B75J/?spm_id_from333.788&vd_source2882acf…

Flink(十二)【容错机制】

前言 最近已经放假了&#xff0c;但是一直在忙一个很重要的自己的一个项目&#xff0c;用 JavaFX 和一个大数据组件联合开发一个功能&#xff0c;也算不枉我学了一次 JavaFX&#xff0c;收获很大&#xff0c;JavaFX 它作为一个 GUI 开发语言&#xff0c;本质还是 Java&#xff…