ShardingJDBC整合MybatisPlus的动态数据源
依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
dynamic-datasource-spring-boot-starter 版本3.1.0 有BUG,异常情况下切换数据源会不成功,导致找不到表,所以使用 4.2.0
配置
spring.shardingsphere.sharding.default-data-source-name = ds
# 数据源配置
spring.shardingsphere.datasource.names = ds
# 数据源具体配置
spring.shardingsphere.datasource.ds.type = com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds.driver-class-name = com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds.jdbc-url = jdbc:mysql://xxxxxxxxxxxxxx:3306/aep?characterEncoding=UTF-8&nullCatalogMeansCurrent=true&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true
spring.shardingsphere.datasource.ds.username = root
spring.shardingsphere.datasource.ds.password = pppppppppppp
# 分表配置 - 表名称
spring.shardingsphere.sharding.tables.aep_abtest_config_deploy_log.actual-data-nodes = ds.aep_abtest_config_deploy_log_$->{2025..2035}0$->{1..9},ds.aep_abtest_config_deploy_log_$->{2025..2035}1$->{0..2}
# 分表策略 - 分片列
spring.shardingsphere.sharding.tables.aep_abtest_config_deploy_log.table-strategy.standard.sharding-column = create_time
# 分表策略 - 精确分片算法类
spring.shardingsphere.sharding.tables.aep_abtest_config_deploy_log.table-strategy.standard.precise-algorithm-class-name = com.transsnet.aep.configuration.MonthlyShardingAlgorithm
# 主键生成策略 - 列名
spring.shardingsphere.sharding.tables.aep_abtest_config_deploy_log.key-generator.column = id
# 主键生成策略 - 类型
spring.shardingsphere.sharding.tables.aep_abtest_config_deploy_log.key-generator.type = SNOWFLAKE
# 显示SQL
spring.shardingsphere.props.sql.show = true
# 是否开启ShardingSphere
spring.shardingsphere.enabled = true
# 数据源连接池配置
spring.shardingsphere.datasource.ds.connection-timeout = 30000
spring.shardingsphere.datasource.ds.idle-timeout = 600000
spring.shardingsphere.datasource.ds.max-lifetime = 1800000
spring.shardingsphere.datasource.ds.maximum-pool-size = 10
spring.shardingsphere.datasource.ds.minimum-idle = 5
spring.shardingsphere.datasource.ds.pool-name = HikariPool-ds
# 默认使用分片数据源
spring.datasource.dynamic.primary = sharding
spring.datasource.dynamic.datasource.ups.poolName = ups-pool
spring.datasource.dynamic.datasource.ups.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.ups.type = com.zaxxer.hikari.HikariDataSource
spring.datasource.dynamic.datasource.ups.url = jdbc:mysql://xxxxxxxxxxxxxx:3306/ups?characterEncoding=UTF-8&nullCatalogMeansCurrent=true&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true
spring.datasource.dynamic.datasource.ups.username = root
spring.datasource.dynamic.datasource.ups.password = pppppppppppp
spring.datasource.dynamic.datasource.dim.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.dim.poolName = dim-pool
spring.datasource.dynamic.datasource.dim.type = com.zaxxer.hikari.HikariDataSource
spring.datasource.dynamic.datasource.dim.url = jdbc:mysql://xxxxxxxxxxxxxx:3306/ups_dim?characterEncoding=UTF-8&nullCatalogMeansCurrent=true&useSSL=false
spring.datasource.dynamic.datasource.dim.username = root
spring.datasource.dynamic.datasource.dim.password = pppppppppppp
代码配置
DynamicDataSourceConfig 类是一个关键的数据源集成配置类,它负责将 ShardingSphere 的分片数据源与 dynamic-datasource 的多数据源动态路由功能进行整合。
核心目标:让 ShardingSphere 的分片数据源能够作为 dynamic-datasource 框架中的一个普通数据源来使用,实现分片数据源和非分片数据源的统一管理。
package com.transsnet.aep.configuration;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider;
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.shardingsphere.shardingjdbc.spring.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.List;
import java.util.Map;
@Configuration
@AutoConfigureBefore({DynamicDataSourceAutoConfiguration.class, SpringBootConfiguration.class})
public class DynamicDataSourceConfig {
@Resource
private DynamicDataSourceProperties properties;
/**
* 未使用分片, 脱敏的名称(默认): shardingDataSource
* shardingjdbc使用了主从: masterSlaveDataSource
* 此处如果主从策略配置在sharding属性下面,需要使用shardingDataSource
*/
@Lazy
@Resource(name = "shardingDataSource")
private DataSource shardingDataSource;
@Resource
private DefaultDataSourceCreator dataSourceCreator;
@Bean
public DynamicDataSourceProvider dynamicDataSourceProvider() {
return new AbstractDataSourceProvider(dataSourceCreator) {
@Override
public Map<String, DataSource> loadDataSources() {
// 先创建动态数据源
Map<String, DataSource> dataSourceMap = createDataSourceMap(properties.getDatasource());
// 确保动态数据源不为空
if (dataSourceMap.isEmpty()) {
dataSourceMap = Maps.newHashMap();
}
// 将ShardingSphere数据源添加到动态数据源集合中
dataSourceMap.put("sharding", shardingDataSource);
return dataSourceMap;
}
};
}
/**
* 将动态数据源设置为首选的
* 当spring存在多个数据源时, 自动注入的是首选的对象
* 设置为主要的数据源之后,就可以支持shardingjdbc原生的配置方式了
*/
@Primary
@Bean
public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) {
List<DynamicDataSourceProvider> providers = Lists.newArrayList(dynamicDataSourceProvider);
DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource(providers);
dataSource.setPrimary(properties.getPrimary());
dataSource.setStrict(properties.getStrict());
dataSource.setStrategy(properties.getStrategy());
dataSource.setP6spy(properties.getP6spy());
dataSource.setSeata(properties.getSeata());
return dataSource;
}
}
这个 DynamicDataSourceConfig 类是一个桥梁类,它:
集成:将 ShardingSphere 的分片能力集成到 dynamic-datasource 框架中
统一:提供统一的数据源访问接口
隔离:确保分片数据源和非分片数据源相互隔离
灵活:支持通过注解动态切换数据源
启动类
@ComponentScan(basePackages = {"com.transsnet"})
@MapperScan(basePackages = {"com.transsnet.aep.mapper"})
// 防止Spring Boot的自动配置与ShardingSphere、dynamic-datasource的配置发生冲突
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
DataSourcePoolMetricsAutoConfiguration.class
})
public class AepWebApplication {
public static void main(String[] args) {
SpringApplication.run(AepWebApplication.class, args);
}
}
启动类中排除这些自动配置类是为了防止Spring Boot的自动配置与ShardingSphere、dynamic-datasource的配置发生冲突。让我详细解释每个排除项的作用:
1. DataSourceAutoConfiguration.class
为什么要排除:
java
exclude = DataSourceAutoConfiguration.class
作用:
防止自动创建数据源:Spring Boot会自动根据
spring.datasource.*配置创建默认数据源避免配置冲突:我们使用ShardingSphere和dynamic-datasource来管理数据源,不需要Spring Boot的自动配置
防止Bean重复:避免创建多个相同类型的数据源Bean导致冲突
如果不排除:
Spring Boot会尝试根据以下配置创建数据源:
properties
spring.datasource.url=...spring.datasource.username=...spring.datasource.password=...
这与我们手动配置的ShardingSphere数据源冲突。
2. DataSourcePoolMetricsAutoConfiguration.class
为什么要排除:
java
exclude = DataSourcePoolMetricsAutoConfiguration.class
作用:
避免监控指标冲突:这个自动配置会为数据源创建监控指标
防止Bean依赖问题:它期望找到Spring Boot自动创建的数据源,但我们使用的是自定义数据源
指标重复:ShardingSphere和dynamic-datasource可能有自己的监控机制
总结
1. 数据源隔离
分片数据源和非分片数据源完全隔离
避免分片逻辑影响到普通业务表
2. 统一管理
通过统一的
@DS注解来切换数据源简化代码,提高可维护性
3. 灵活扩展
可以轻松添加新的数据源
分片和非分片数据源可以独立演进
ShardingJDBC整合MybatisPlus的动态数据源的更多相关文章
- SpringBoot整合MyBatisPlus配置动态数据源
目录 SpringBoot整合MyBatisPlus配置动态数据源 SpringBoot整合MyBatisPlus配置动态数据源 推文:2018开源中国最受欢迎的中国软件MyBatis-Plus My ...
- 多数据源系统接入mybatis-plus, 实现动态数据源、动态事务。
目录: 实现思想 导入依赖.配置说明 代码实现 问题总结 一.实现思想 接手一个旧系统,SpringBoot 使用的是纯粹的 mybatis ,既没有使用规范的代码生成器,也没有使用 JPA 或者 m ...
- Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory
一.摘要 上两篇文章分别介绍了Spring3.3 整合 Hibernate3.MyBatis3.2 配置多数据源/动态切换数据源 方法 和 Spring3 整合Hibernate3.5 动态切换Ses ...
- SpringBoot和Mycat动态数据源项目整合
SpringBoot项目整合动态数据源(读写分离) 1.配置多个数据源,根据业务需求访问不同的数据,指定对应的策略:增加,删除,修改操作访问对应数据,查询访问对应数据,不同数据库做好的数据一致性的处理 ...
- (十六)配置多数据源,整合MybatisPlus增强插件
配置多数据源,整合MybatisPlus增强插件 多数据简介 MybatisPlus简介 1.案例实现 1.1 项目结构 1.2 多数据源配置 1.3 参数扫描类 1.4 配置Druid连接池 1.5 ...
- SpringBoot 整合 MyBatis-Plus 入门体验
一.前言 本文小编将基于 SpringBoot 整合 MyBatis-Plus , MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上做增强并且不改变原本功能 ...
- 【项目实战】从零到一搭建Spring Boot整合Mybatis-plus
前言 2023年想搭建一套属于自己的框架,做一个属于自己想法的项目.这些年工作中一直用公司已有的框架,以前有跟着学习视频搭建过,但自己真正动手搭建时发现问题还是很多,比如没有引入Mybatis-plu ...
- Spring3 整合Hibernate3.5 动态切换SessionFactory (切换数据库方言)
一.缘由 上一篇文章Spring3.3 整合 Hibernate3.MyBatis3.2 配置多数据源/动态切换数据源 方法介绍到了怎么样在Sping.MyBatis.Hibernate整合的应用中动 ...
- SSH配置动态数据源
用到一个项目,需要整合2个不同的数据库! 现将代码贴下,以备后用: 1.创建静态映射类,该类映射动态数据源 public class DataSourceMap { public static fin ...
- Spring动态数据源的配置
Spring动态数据源 我们很多项目中业务都需要涉及到多个数据源,就是对不同的方法或者不同的包使用不同的数据源.最简单的做法就是直接在Java代码里面lookup需要的数据源,但是这种做法耦合性太高, ...
随机推荐
- Docker部署RestCloud ETL社区
镜像说明 nriet/restcloud:latest version:1.3.0 os:slim-buster tomcat:基于官方镜像 tomcat:8.5.78-jdk8-openjdk-sl ...
- win10专业版开机电脑红屏的问题
有深度技术的win10专业版用户,发现电脑开机后屏幕会变成红色的,再次重启电脑,也没有恢复正常,这个问题怎么解决呢?其实,这是因为显示设置出了问题,所以才会出现这种情况.那么,我们该怎么解决这个问题呢 ...
- Unity框架 EcsRx
文档:https://ecsrx.gitbook.io/project/ github: https://github.com/EcsRx/ecsrx.unity
- 跨平台自动化框架的OCR点击操作实现详解与思考
在移动端自动化测试领域,基于文字内容的操作一直是一个技术难点.HttpRunner通过集成OCR(光学字符识别)技术,实现了高精度的文字定位与点击功能,为开发者提供了更加直观和可靠的自动化测试方案. ...
- git合并远程分支
git合并远程分支 # 1. 把源码clone到本地 git clone [gitsite git远程网址] # 2. 在本地建立一个和远程分支相同的本地分支 git checkout -b dev ...
- Origin2024如何制作双Y轴图?
日常科研中,我们经常会用到x-y轴图,但有时候一个x对应两个y值甚至多个y值,那应该怎么做呢?下面给大家分享绘制双Y轴图的操作方法: 操作步骤: 1.先打开Origin2024软件,然后在Book1中 ...
- 苹果容器Apple container是做什么用的?
一.Apple container是什么 container是苹果公司出的一款容器工具.以轻量级虚拟机方式创建.运行Linux容器.那么,Linux容器又是什么呢? Linux容器是一种特殊的进程 进 ...
- [题解]P3147 [USACO16OPEN] 262144 P
P3146 [USACO16OPEN] 248 G(弱化版) P3147 [USACO16OPEN] 262144 P 我们先考虑区间dp,设\(f[i][j]\)表示\(a[i,j]\)恰好合并成\ ...
- Manus快速搭建个人网站
今年国内的AI赛道,有两款产品算是挂在热搜上. 那就是DeepSeek和Manus,年初DeepSeek爆火,Manus紧随其后也莫名火了.不过当时Manus算是黑红体,因为它一夜成名的时候,大部分用 ...
- llamafactory文档
https://llamafactory.readthedocs.io/zh-cn/latest/index.html https://blog.csdn.net/python12345678_/ar ...