Spring Boot動的データソースの設定方法
Spring Bootで動的データソースを設定するには、以下のような手順が必要です。
- pom.xmlファイルに以下の依存関係を追加します:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.9.0</version>
</dependency>
- DataSourceの設定を行うDataSourceConfigクラスを作成する
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@Primary
public DynamicDataSource dataSource(DataSource masterDataSource, DataSource slaveDataSource) {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("master", masterDataSource);
targetDataSources.put("slave", slaveDataSource);
DynamicDataSource dataSource = new DynamicDataSource();
dataSource.setTargetDataSources(targetDataSources);
dataSource.setDefaultTargetDataSource(masterDataSource);
return dataSource;
}
}
- application.propertiesファイルにてデータソースに関するプロパティを設定する。
# 主数据源配置
spring.datasource.master.url = jdbc:mysql://localhost:3306/master_database
spring.datasource.master.username = root
spring.datasource.master.password = root
# 从数据源配置
spring.datasource.slave.url = jdbc:mysql://localhost:3306/slave_database
spring.datasource.slave.username = root
spring.datasource.slave.password = root
- 動的データソース切り替え用のDynamicDataSourceクラスを作成
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSource();
}
}
- データソースコンテクストホルダーを作成し、現在のスレッドが使用するデータソースを保持する:
public class DataSourceContextHolder {
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
public static void setDataSource(String dataSource) {
CONTEXT_HOLDER.set(dataSource);
}
public static String getDataSource() {
return CONTEXT_HOLDER.get();
}
public static void clearDataSource() {
CONTEXT_HOLDER.remove();
}
}
- AopDataSourceAspectクラスを作成し、データソースの切り替えに使用します
@Aspect
@Component
public class AopDataSourceAspect {
@Before("@annotation(com.example.dynamicdatasource.annotation.DataSource)")
public void switchDataSource(JoinPoint point) {
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
DataSource dataSource = method.getAnnotation(DataSource.class);
if (dataSource == null) {
DataSourceContextHolder.setDataSource("master");
} else {
DataSourceContextHolder.setDataSource(dataSource.value());
}
}
@After("@annotation(com.example.dynamicdatasource.annotation.DataSource)")
public void restoreDataSource(JoinPoint point) {
DataSourceContextHolder.clearDataSource();
}
}
- データソース
@DataSource("slave")
public List<User> getUsers() {
// 查询从数据源
}
以上の設定により、Spring Boot で動的データソースの切り替えを実現できます。