java切换数据源查询
时间: 2023-11-18 19:42:26 浏览: 35
在Java中切换数据源查询可以通过以下步骤实现:
1. 定义两个数据源的配置信息,例如在application.properties中定义:
```
spring.datasource.primary.url=jdbc:mysql://localhost:3306/db1
spring.datasource.primary.username=root
spring.datasource.primary.password=123456
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/db2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
```
2. 创建两个数据源对象并注入到Spring容器中,例如:
```java
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix="spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
@ConfigurationProperties(prefix="spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
```
3. 创建一个数据源切换的AOP切面,例如:
```java
@Aspect
@Component
public class DataSourceAspect {
@Pointcut("execution(* com.example.service.*.*(..))")
public void servicePointcut() {}
@Before("servicePointcut()")
public void beforeService(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
if (methodName.startsWith("select")) {
DynamicDataSourceContextHolder.setDataSourceKey("secondaryDataSource");
} else {
DynamicDataSourceContextHolder.setDataSourceKey("primaryDataSource");
}
}
@After("servicePointcut()")
public void afterService(JoinPoint joinPoint) {
DynamicDataSourceContextHolder.clearDataSourceKey();
}
}
```
4. 在需要切换数据源的Service方法上添加@DataSource注解,例如:
```java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
@DataSource("primaryDataSource")
public User getUserById(int id) {
return userMapper.getUserById(id);
}
@Override
@DataSource("secondaryDataSource")
public List<User> getUsers() {
return userMapper.getUsers();
}
}
```
这样,在调用getUserById方法时,会使用primaryDataSource数据源进行查询;调用getUsers方法时,会使用secondaryDataSource数据源进行查询。注意要在调用方法之前设置正确的数据源,调用之后清除设置的数据源。