喜迎
春节

多数据源知识体系


简介:dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。

其支持 Jdk 1.7+, SpringBoot 1.5.x 2.x.x 3.x.x。

JPA用户不建议使用,JPA自带事务,无法连续切库

基础

特性

  • 支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。
  • 支持数据库敏感配置信息 加密(可自定义) ENC()。
  • 支持每个数据库独立初始化表结构schema和数据库database。
  • 支持无数据源启动,支持懒加载数据源(需要的时候再创建连接)。
  • 支持 自定义注解 ,需继承DS(3.2.0+)。
  • 提供并简化对Druid,HikariCp,BeeCp,Dbcp2的快速集成。
  • 提供对Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等组件的集成方案。
  • 提供 自定义数据源来源 方案(如全从数据库加载)。
  • 提供项目启动后 动态增加移除数据源 方案。
  • 提供Mybatis环境下的 纯读写分离 方案。
  • 提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持自定义。
  • 支持 多层数据源嵌套切换 。(ServiceA >>> ServiceB >>> ServiceC)。
  • 提供 基于seata的分布式事务方案 。
  • 提供 本地多数据源事务方案。

约定

  • 本框架只做 切换数据源 这件核心的事情,并不限制你的具体操作,切换了数据源可以做任何CRUD。
  • 配置文件所有以下划线 _ 分割的数据源 首部 即为组的名称,相同组名称的数据源会放在一个组下。
  • 切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。
  • 默认的数据源名称为 master ,你可以通过 spring.datasource.dynamic.primary 修改。
  • 方法上的注解优先于类上注解。
  • DS支持继承抽象类上的DS,暂不支持继承接口上的DS。

使用方法

引入maven依赖

  • 适用spring-boot 1.5.x 2.x.x
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${version}</version>
</<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${version}</version>
</dependency>
  • 适用 spring-boot3
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
<version>${version}</version>
</<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
<version>${version}</version>
</dependency>

配置数据源

spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
slave_1:
url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
slave_2:
url: ENC(xxxxx) # 内置加密,使用请查看详细文档
username: ENC(xxxxx)
password: ENC(xxxxx)
driver-class-name: com.mysql.jdbc.Driver
#......省略
#以上会配置一个默认库master,一个组slave下有两个子库slave_1,slave_2
# 多主多从                      纯粹多库(记得设置primary)                   混合配置
spring: spring: spring:
datasource: datasource: datasource:
dynamic: dynamic: dynamic:
datasource: datasource: datasource:
master_1: mysql: master:
master_2: oracle: slave_1:
slave_1: sqlserver: slave_2:
slave_2: postgresql: oracle_1:
slave_3: h2: oracle_2:

使用 @DS 切换数据源

  • <code>@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解。</code>
注解 结果
没有@DS 默认数据源
@DS(“dsName”) dsName可以为组名也可以为具体某个库的名称
@Service
@DS("slave")
public class UserServiceImpl implements UserService {

@Autowired
private JdbcTemplate jdbcTemplate;

public List selectAll() {
return jdbcTemplate.queryForList("select * from user");
}

@Override
@DS("slave_1")
public List selectByCondition() {
return jdbcTemplate.queryForList(@Service
@DS("slave")
public class UserServiceImpl implements UserService {

@Autowired
private JdbcTemplate jdbcTemplate;

public List selectAll() {
return jdbcTemplate.queryForList("select * from user");
}

@Override
@DS("slave_1")
public List selectByCondition() {
return jdbcTemplate.queryForList("select * from user where age >10");
}
}

重要内容

DataSourceProperty配置

参数 说明 执行
poolName 连接池名称(只是一个标识) 默认配置文件上的名称
type 连接池类型 不设置会自动查找druid-hikaricp 例如druid type:com.alibaba.druid.pool.DruidDataSource
driverClassName 驱动 com.mysql.cj.jdbc.Driver
username、url、password jdbc用户名,连接地址,密码
jndiName jndi数据源名称 设置即标识启用
seata、p6spy 是否启用分布式事务、数据库sql动态监控 默认true
lazy 是否开启懒加载
DatasourceInitProperties 初始化,建表、语句脚本执行
DruidConfig druid配置
HikariCpConfig HikariCp参数配置
BeeCpConfig 小型 JDBC 连接池组件配置
Dbcp2Config DBCP2参数配置
AtomikosConfig atomikos参数配置
publicKey 解密公匙(如果未设置默认使用全局的)

DefaultDataSourceCreator数据源创建器

  • 获取相匹配的数据源创建器,创建DataSource数据源,确认是否开启懒加载及publicKey设置(createDataSource)
  • 执行初始化脚本(runScrip)
  • 包装数据源,p6spy及seara配置(wrapDataSource)

DynamicRoutingDataSource核心动态数据源组件

  • extends AbstractRoutingDataSource implements InitializingBean, DisposableBean
  • 获取数据源及添加创建的数据源
  • 删除及关闭数据源
  • 添加分组
  • 数据源环境配置

详细文档以官方为准

多数据源官方文档地址~


文章作者: jwang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 jwang !
 上一篇
多数据源-多租户实践
多数据源-多租户实践
项目情景:多个用户,每个用户都存在一个数据库资源,所有用户数据源信息存放在另一个主库表中(可以是其它数据库) 问题:采用AbstractRoutingDataSource无法统一管理数据源并与连接池实时管理,多数据源也需要实时加载
2024-08-30
下一篇 
博客美化及修改
博客美化及修改
前言 该文档主要记录模板修改及自定义相关调整的所有细节 jwangtec个人介绍 基于jwangtec个人博客是基于Hexo博客Matery主题魔改,并采用nekodeng魔改~。 提示本博客为纯静态,无数据库,文章使用markdown格
2024-08-29
  目录