1、dynamic-datasource介绍
在当今这个数据驱动的时代,企业级应用面临着越来越多的挑战。其中,多数据源管理成为了一个关键问题。为了解决这一问题,Dynamic-Datasource应运而生。本文将为您详细介绍Dynamic-Datasource这一多数据源解决方案,带您领略其带来的便捷与高效。
2、dynamic-datasource使用
以下以springboot3为例
(1)引入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
</dependency>
(2)添加多数据源配置
server:
port: 9393
spring:
autoconfigure:
exclude: com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure
datasource:
dynamic:
druid:
initial-size: 10 # 初始化连接池大小
min-idle: 20 # 连接池最小空闲连接数
maxActive: 500 # 连接池最大活跃连接数
maxWait: 60000 # 获取连接的最大等待时间(毫秒)
timeBetweenEvictionRunsMillis: 60000 # 检测连接是否空闲的时间间隔(毫秒)
minEvictableIdleTimeMillis: 300000 # 连接在池中最小空闲时间(毫秒)
query-timeout: 3600 # 查询超时时间(秒)
primary: master # 主数据源名称,这里设置为 master
strict: false # 是否严格检查数据源,false 表示不严格检查
grace-destroy: true # 是否优雅销毁连接池,true 表示优雅销毁,等待 10 秒后再销毁
datasource:
master:
url: jdbc:mysql://127.0.0.1:3306/t1
username: root
password: ***
driver-class-name: com.mysql.cj.jdbc.Driver
slave1:
url: jdbc:mysql://127.0.0.1:3306/t2
username: root
password: ***
driver-class-name: com.mysql.cj.jdbc.Driver
# slave2:
# url: jdbc:mysql://127.0.0.1:3306/t3
# username: root
# password: ***
# driver-class-name: com.mysql.cj.jdbc.Driver
aop:
enabled: true # 可能表示延迟加载数据源,即在实际需要时才创建和初始化数据源。
lazy: true
(3)使用
A: 注解方式
@DB
该注解可以用于方法上,标注方法走对应的数据源
eg:
B:手动模式
直接在操作数据之前指定数据库
DynamicDataSourceContextHolder.push("slave2");
(4) 实现传入url创建数据源
A:将bean注入到spring统一管理
@Configuration
public class DataSourceConfig {
@Autowired
private DynamicDataSourceProperties properties;
@Bean
public DynamicRoutingDataSource dataSource() {
DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource(List.of());
dataSource.setPrimary(properties.getPrimary());
dataSource.setStrict(properties.getStrict());
for (String key : properties.getDatasource().keySet()) {
DataSourceProperty dataSourceProperty = properties.getDatasource().get(key);
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setUrl(dataSourceProperty.getUrl());
ds.setUsername(dataSourceProperty.getUsername());
ds.setPassword(dataSourceProperty.getPassword());
ds.setDriverClassName(dataSourceProperty.getDriverClassName());
dataSource.addDataSource(key,ds);
}
return dataSource;
}
}
B:动态将数据库链接配置传入创建数据源加入到路由集合
@Override
public boolean createDdBase(Source source) {
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setUrl("jdbc:mysql://127.0.0.1:3306/t3");
ds.setUsername(source.getUserName());
ds.setPassword(source.getPassWord());
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.addDataSource("slave2",ds);
return true;
}
(5)测试
场景一:
请求携带数据源名称,在过滤器拦截切换对应数据源
场景二:
先携带数据源连接请求创建数据源,然后再请求新的数据源