springboot动态数据源示例Hikari
时间: 2023-10-12 13:17:34 浏览: 162
springboot 多数据源实例
下面是一个使用 HikariCP 实现动态数据源的 Spring Boot 示例:
1. 首先,需要添加 HikariCP 和 MySQL 驱动的依赖:
```xml
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
```
2. 然后,定义一个 `DataSourceProperties` 类,用于为每个数据源配置相应的属性:
```java
@ConfigurationProperties(prefix = "app.datasource")
public class DataSourceProperties {
private String url;
private String username;
private String password;
private String driverClassName;
// ...
}
```
3. 接着,创建一个 `DataSourceConfig` 类,用于配置多个数据源:
```java
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "app.datasource.master")
public DataSource masterDataSource() {
// 配置 master 数据源的属性
return new HikariDataSource();
}
@Bean
@ConfigurationProperties(prefix = "app.datasource.slave")
public DataSource slaveDataSource() {
// 配置 slave 数据源的属性
return new HikariDataSource();
}
@Bean
@Primary
public DataSource dynamicDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
@Qualifier("slaveDataSource") DataSource slaveDataSource) {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("master", masterDataSource);
dataSourceMap.put("slave", slaveDataSource);
dynamicDataSource.setTargetDataSources(dataSourceMap);
dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
return dynamicDataSource;
}
}
```
4. 创建一个 `DynamicDataSource` 类,用于实现动态数据源的切换:
```java
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceContextHolder.getDataSource();
}
}
```
5. 最后,定义一个 `DynamicDataSourceContextHolder` 类,用于在多线程环境下保存当前数据源的 key:
```java
public class DynamicDataSourceContextHolder {
private static final ThreadLocal<Object> contextHolder = new ThreadLocal<>();
public static void setDataSource(Object dataSource) {
contextHolder.set(dataSource);
}
public static Object getDataSource() {
return contextHolder.get();
}
public static void clearDataSource() {
contextHolder.remove();
}
}
```
这样,我们就实现了动态数据源的切换。在需要切换数据源的地方,只需要调用 `DynamicDataSourceContextHolder.setDataSource(key)` 方法即可。
阅读全文