要实现不使用 @Transactional 无法切换 AbstractRoutingDataSource,可以通过编程的方式手动切换数据源。以下是一个示例代码:
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
AbstractRoutingDataSource routingDataSource = new AbstractRoutingDataSource() {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceKey();
}
};
Map
在需要切换数据源的地方,可以手动调用 DataSourceContextHolder.setDataSourceKey("dataSource1")
或 DataSourceContextHolder.setDataSourceKey("dataSource2")
来切换数据源。例如:
@Service
public class MyService {
@Autowired
private DataSource dataSource;
public void doSomething() {
DataSourceContextHolder.setDataSourceKey("dataSource1");
// 使用 dataSource 执行操作
DataSourceContextHolder.clearDataSourceKey();
}
}
这样就可以手动切换数据源,而不依赖于 @Transactional 注解来切换。