mybatis切换数据源
时间: 2023-07-02 14:11:09 浏览: 101
在 MyBatis 中切换数据源可以通过动态配置 SqlSessionFactory 的方式来实现。
首先,需要在项目中引入多个数据源的配置,例如在 Spring Boot 中可以将多个数据源配置在 application.yml 或 application.properties 文件中。
然后,可以通过编写一个继承自 AbstractRoutingDataSource 的动态数据源来进行数据源的切换。该类需要重写 determineCurrentLookupKey 方法,该方法返回的值就是当前使用的数据源的 key。
最后,在配置 SqlSessionFactory 时,将上述动态数据源作为其数据源即可。
下面是一个示例代码:
```java
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public DataSource dynamicDataSource() {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("primary", primaryDataSource());
targetDataSources.put("secondary", secondaryDataSource());
DynamicDataSource dataSource = new DynamicDataSource();
dataSource.setTargetDataSources(targetDataSources);
dataSource.setDefaultTargetDataSource(primaryDataSource());
return dataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dynamicDataSource());
return sessionFactory.getObject();
}
}
```
其中,DynamicDataSource 类继承自 AbstractRoutingDataSource,其代码如下:
```java
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceKey();
}
}
```
DataSourceContextHolder 类用于存储当前使用的数据源的 key,可以使用 ThreadLocal 来实现。例如:
```java
public class DataSourceContextHolder {
private static final ThreadLocal<String> CONTEXT_HOLDER = ThreadLocal.withInitial(() -> "primary");
public static void setDataSourceKey(String dataSourceKey) {
CONTEXT_HOLDER.set(dataSourceKey);
}
public static String getDataSourceKey() {
return CONTEXT_HOLDER.get();
}
public static void clearDataSourceKey() {
CONTEXT_HOLDER.remove();
}
}
```
在需要切换数据源的地方,可以调用 DataSourceContextHolder.setDataSourceKey 方法设置当前使用的数据源的 key。例如:
```java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> listUsers() {
DataSourceContextHolder.setDataSourceKey("secondary");
List<User> users = userMapper.listUsers();
DataSourceContextHolder.clearDataSourceKey();
return users;
}
}
```
上述代码中,在调用 userMapper.listUsers 方法之前先设置当前使用的数据源为 secondary,调用之后再清除设置。这样就可以实现在运行时动态切换数据源的功能。
阅读全文