mybatis 中mysql、oracle双数据源动态切换
时间: 2024-10-19 08:06:57 浏览: 57
在MyBatis中配置MySQL和Oracle双数据源并实现动态切换,通常是在Spring Boot应用中结合Spring Data JPA和AOP(面向切面编程)来完成的。以下是步骤:
1. **配置两个数据源**:
- 配置两个JDBC DataSource,分别对应MySQL和Oracle数据库。可以在Spring的`application.properties`或`application.yml`文件中设置,比如:
```properties
spring.datasource.db1.url=jdbc:mysql://localhost:3306/db_mysql
spring.datasource.db1.username=root
spring.datasource.db1.password=...
spring.datasource.db2.url=jdbc:oracle:thin:@//hostname:port/service_name
spring.datasource.db2.username=...
spring.datasource.db2.password=...
```
- 使用Spring的`@ConfigurationProperties`自动扫描配置。
2. **创建DataSource代理**:
- 创建一个自定义的DataSource接口,如`DualDataSource`,它将包装两个真实的DataSource,并提供切换的方法。
- 实现该接口,例如通过`@LoadBalanced`注解和`@Primary`选择其中一个默认连接:
```java
@Configuration
public class DualDataSourceConfig {
@Bean(name = "db1")
@LoadBalanced
@Primary
public DataSource db1() {
// MySQL配置
return ...;
}
@Bean(name = "db2")
public DataSource db2() {
// Oracle配置
return ...;
}
@Bean
public DualDataSource dualDataSource() {
return new DualDataSource(db1(), db2());
}
}
```
3. **利用AOP切换数据源**:
- 使用Spring AOP的`@Aspect`和`@Around`注解,在需要切换数据源的地方拦截SQL执行:
```java
@Aspect
public class DynamicDataSourceAspect {
@Around("@annotation(sqlType)")
public Object around(ProceedingJoinPoint joinPoint, SqlType sqlType) throws Throwable {
// 切换数据源逻辑,根据sqlType获取对应的DataSource
DataSource dataSource = ...; // 根据业务场景判断是db1还是db2
// 设置当前线程的DataSource
PlatformTransactionManager transactionManager = (PlatformTransactionManager) joinPoint.getTarget();
TransactionDefinition def = transactionManager.getTransactionDefinition();
DefaultTransactionDefinition defaultDef = new DefaultTransactionDefinition();
defaultDef.setDataSource(dataSource);
transactionManager.setTransactionDefinition(defaultDef);
try {
return joinPoint.proceed();
} finally {
transactionManager.rollbackIfNecessary();
transactionManager.clearResourcedataSourceName();
}
}
}
```
- 在实体类方法上使用`@SqlType`注解指定SQL类型,如查询、插入等。
阅读全文