package com.badao.demo;
import com.badao.demo.entity.DataSourceDTO;
import com.badao.demo.entity.SUser;
import com.badao.demo.mapper.SUserMapper;
import com.badao.demo.utils.DynamicDSExecute;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.HikariDataSourceCreator;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zaxxer.hikari.HikariDataSource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.Set;
import java.util.function.Supplier;
@SpringBootTest
class DynamicDataSourceTest {
@Autowired
private DataSource dataSource;
@Autowired(required = false)
private HikariDataSourceCreator hikariDataSourceCreator;
@Autowired
private SUserMapper sUserMapper;
/**
* 获取当前所有数据源
*/
@Test
void getAllDataSource() {
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
System.out.println(ds.getCurrentDataSources().keySet());
}
/**
* 添加 与 删除 HikariCP数据源
*/
@Test
void addHcpDataSource() {
DataSourceDTO sqlserver = DataSourceDTO.builder()
.dataSourceName("sqlserver")
.driverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
.url("jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test")
.username("sa")
.password("123456")
.build();
DataSourceProperty dataSourceProperty = new DataSourceProperty();
BeanUtils.copyProperties(sqlserver,dataSourceProperty);
DataSource sqlserverDataSource = hikariDataSourceCreator.createDataSource(dataSourceProperty);
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
ds.addDataSource(sqlserver.getDataSourceName(),sqlserverDataSource);
System.out.println(ds.getCurrentDataSources().keySet());
ds.removeDataSource(sqlserver.getDataSourceName());
System.out.println(ds.getCurrentDataSources().keySet());
}
/**
* 检测数据源
*/
@Test
void testDataSource(){
DataSourceDTO sqlserver = DataSourceDTO.builder()
.dataSourceName("sqlserver")
.driverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
.url("jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test")
.username("sa")
.password("123456")
.build();
boolean checkDataBase = checkDataBase(sqlserver);
System.out.println(checkDataBase);
DataSourceDTO sqlserverWrong = DataSourceDTO.builder()
.dataSourceName("sqlserver")
.driverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
.url("jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test")
.username("sa")
.password("123456")
.build();
boolean checkDataBaseWrong = checkDataBase(sqlserverWrong);
System.out.println(checkDataBaseWrong);
}
/**
* 手动切换数据源
*/
@Test
void changeDataSource() {
DataSourceDTO sqlserver = DataSourceDTO.builder()
.dataSourceName("sqlserver")
.driverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
.url("jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test")
.username("sa")
.password("123456")
.build();
boolean checkDataBase = checkDataBase(sqlserver);
if(checkDataBase){
DataSourceProperty dataSourceProperty = new DataSourceProperty();
BeanUtils.copyProperties(sqlserver,dataSourceProperty);
DataSource sqlserverDataSource = hikariDataSourceCreator.createDataSource(dataSourceProperty);
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
Set<String> dataSourceSet = ds.getCurrentDataSources().keySet();
if (!dataSourceSet.contains(sqlserver.getDataSourceName())) {
ds.addDataSource(sqlserver.getDataSourceName(),sqlserverDataSource);
}
//push 设置当前线程数据源 如非必要不要手动调用,调用后确保最终清除
DynamicDataSourceContextHolder.push(sqlserver.getDataSourceName());
List<SUser> sUsers = sUserMapper.selectList(new LambdaQueryWrapper<>());
System.out.println(sUsers);
//DynamicDataSourceContextHolder.poll();
//poll 清空当前线程数据源 如果当前线程是连续切换数据源 只会移除掉当前线程的数据源名称
//clear 强制清空本地线程 防止内存泄漏,如手动调用了push可调用此方法确保清除
DynamicDataSourceContextHolder.clear();
ds.removeDataSource(sqlserver.getDataSourceName());
}else {
System.out.println("数据源连接异常");
}
}
/**
* 手动切换数据源-工具类方法
*/
@Test
void changeDataSourceByUtils() {
DataSourceDTO sqlserver = DataSourceDTO.builder()
.dataSourceName("sqlserver")
.driverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
.url("jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test")
.username("sa")
.password("123456")
.build();
boolean checkDataBase = checkDataBase(sqlserver);
if(checkDataBase){
DataSourceProperty dataSourceProperty = new DataSourceProperty();
BeanUtils.copyProperties(sqlserver,dataSourceProperty);
DataSource sqlserverDataSource = hikariDataSourceCreator.createDataSource(dataSourceProperty);
DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
Set<String> dataSourceSet = ds.getCurrentDataSources().keySet();
if (!dataSourceSet.contains(sqlserver.getDataSourceName())) {
ds.addDataSource(sqlserver.getDataSourceName(),sqlserverDataSource);
}
Supplier<List<SUser>> supplier = () -> sUserMapper.selectList(new LambdaQueryWrapper<>());
List<SUser> sUsers = DynamicDSExecute.execute(sqlserver.getDataSourceName(),supplier);
System.out.println(sUsers);
ds.removeDataSource(sqlserver.getDataSourceName());
}else {
System.out.println("数据源连接异常");
}
}
/**
* 检测数据源
* @param dataSourceDTO
* @return
*/
private boolean checkDataBase(DataSourceDTO dataSourceDTO){
Connection connection = null;
try {
DataSource dataSource = creatHcpDataSource(dataSourceDTO);
connection = dataSource.getConnection();
Statement statement = connection.createStatement();
statement.execute("select * from s_user");
return true;
} catch (Exception exception) {
return false;
}finally {
try {
if(null!=connection){
connection.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
/**
* 创建Hcp datasource
* @param dataSourceDTO
* @return
*/
private DataSource creatHcpDataSource(DataSourceDTO dataSourceDTO){
HikariDataSource dataSource = new H
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
SpringBoot+dynamic-datasource实现多数据源(msyql、sqlserver)手动切换示例代码 https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135701561
资源推荐
资源详情
资源评论
收起资源包目录
SpringBoot+dynamicDataSource动态添加删除数据源示例代码.rar (23个子文件)
SpringBoot+dynamicDataSource动态添加删除数据源示例代码
dynamicDataSourceDemo
HELP.md 934B
pom.xml 4KB
src
test
java
com
badao
demo
DynamicDataSourceTest.java 9KB
main
resources
mapper
UserMapper.xml 701B
application.yml 3KB
java
com
badao
demo
DemoApplication.java 402B
mapper
UserMapper.java 653B
SUserMapper.java 257B
StudentMapper.java 326B
controller
utils
RedisCache.java 5KB
DynamicDSExecute.java 500B
service
UserService.java 194B
serviceImpl
UserServiceImpl.java 501B
entity
DataSourceDTO.java 289B
SUser.java 563B
Student.java 568B
User.java 681B
config
DataSourceOfPG.java 274B
RedisConfig.java 2KB
FastJson2JsonRedisSerializer.java 2KB
MybatisPlusConfig.java 742B
dynamicDataSourceDemo.iml 12KB
.gitignore 395B
共 23 条
- 1
资源评论
霸道流氓气质
- 粉丝: 1w+
- 资源: 589
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功