mybatis springboot3 多数据源切换
时间: 2024-12-27 10:13:51 浏览: 2
### 实现Spring Boot 3中MyBatis多数据源切换
在Spring Boot 3环境中配置多个数据源并与MyBatis集成是一个常见的需求,尤其是在处理不同数据库实例或不同类型的数据存储时。以下是详细的实现方法:
#### 配置文件设置
为了支持多数据源,`application.properties` 或 `application.yml` 文件中的配置需要针对每个数据源分别定义连接属性。
对于MySQL和Redis组合的情况可以参考如下配置[^1]:
```yaml
spring:
datasource:
primary:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.198.201:3308/primary_db?serverTimezone=Asia/Shanghai
username: root
password: qingfengzilai.
secondary:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://localhost:5432/secondary_db
username: user
password: pass
redis:
host: 192.168.198.201
port: 6379
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
```
注意这里增加了第二个数据源(假设为PostgreSQL),并且通过前缀区分不同的数据源名称。
#### Java配置类编写
接着创建Java配置类来注册这些数据源以及对应的SqlSessionFactoryBean对象。
```java
@Configuration
public class DataSourceConfig {
@Primary
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix="spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix="spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
// ...其他必要的bean定义...
}
```
上述代码片段展示了如何声明两个名为`primaryDataSource` 和 `secondaryDataSource` 的数据源 bean,并指定了各自的前缀用于读取相应的配置项。
#### 动态数据源路由逻辑
为了让应用程序能够在运行期间动态选择合适的数据源执行查询操作,则需引入自定义的抽象层——即所谓的“动态数据源”。
```java
import javax.sql.DataSource;
import java.util.Map;
@Component
@Aspect
public class DynamicDataSource extends AbstractRoutingDataSource {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
@Override
protected Object determineCurrentLookupKey() {
String dataSourceName = getDataSource();
if (dataSourceName == null || "".equals(dataSourceName.trim())) {
return "primary";
} else {
return dataSourceName;
}
}
public void setDataSource(String dataSourceName){
contextHolder.set(dataSourceName);
}
public String getDataSource(){
return contextHolder.get();
}
public void clearDataSource(){
contextHolder.remove();
}
}
@Bean(name = "dynamicDataSource")
public DataSource dynamicDataSource(@Qualifier("primaryDataSource") DataSource primaryDataSource,
@Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("primary", primaryDataSource);
targetDataSources.put("secondary", secondaryDataSource);
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.setDefaultTargetDataSource(primaryDataSource);
dynamicDataSource.setTargetDataSources(targetDataSources);
return dynamicDataSource;
}
```
这段代码实现了基于AOP切面编程模式下的动态数据源管理器,它允许开发者根据业务场景灵活指定要使用的具体数据源。
#### 使用示例
当想要访问特定的数据源时,可以通过调用`DynamicDataSource`的方法来进行切换:
```java
@Autowired
private DynamicDataSource dynamicDataSource;
// 切换至主库
dynamicDataSource.setDataSource("primary");
try{
// 执行一些SQL语句...
} finally {
// 清除上下文中保存的目标数据源名
dynamicDataSource.clearDataSource();
}
```
以上就是关于在Spring Boot 3环境下利用MyBatis实现多数据源切换的主要步骤和技术要点。
阅读全文