springboot动态数据源使用
动态数据源配置,通过数据库存储数据源连接信息,动态使用不同的数据库进行数据处理。使用自定义注解标识使用默认数据库。
Application.yml
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
</dependencies>
DatasourceConfiguration:
配置文件:
/**
* @author kuangsha
* @date 2020/6/29 9:25
*/
@Configuration
public class DatasourceConfiguration {
/**
* 注册bean 拿到动态数据源
* 每次数据库操作都会执行DynamicDatasource 中重写的getConnection()方法
* @return
*/
@Bean
public DataSource dataSource() {
DataSourceBuilder<?> dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.type(DynamicDatasource.class);
return dataSourceBuilder.build();
}
}
DynamicDatasource类:
使用数据源之前先getConnection连接数据源,首先获取当前使用的数据源id,DatasourceHolder中通过数据源id获取数据源信息,如果没有数据源就初始化数据源连接
/**
* @author kuangsha
* @date 2020/6/29 9:27
*/
@Slf4j
public class DynamicDatasource extends HikariDataSource {
@Override
public Connection getConnection() throws SQLException {
// 获取当前数据源 id
Long id = DatasourceConfigContextHolder.getCurrentDatasourceConfig();
// 根据当前id获取数据源
HikariDataSource dataSource = DatasourceHolder.INSTANCE.getDatasource(id);
if (null == dataSource) {
// 初始化数据源
dataSource = initDatasource(id);
}
return dataSource.getConnection();
}
/**
* 初始化数据源
*
* @param id
* @return
*/
private HikariDataSource initDatasource(Long id) {
HikariDataSource dataSource = new HikariDataSource();
// 判断是否是默认数据源
if (DatasourceHolder.DEFAULT_ID.equals(id)) {
// 默认数据源根据 application.yml 配置的生成
DataSourceProperties properties = SpringUtil.getBean(DataSourceProperties.class);
dataSource.setJdbcUrl(properties.getUrl());
dataSource.setUsername(properties.getUsername());
dataSource.setPassword(properties.getPassword());
dataSource.setDriverClassName(properties.getDriverClassName());
} else {
DatasourceConfig datasourceConfig = DatasourceConfigCache.INSTANCE.getConfig(