使用 @DS 注解可以实现在一个方法中先查询数据库 A,再查询数据库 B 的功能。但是要确保在查询数据库 B 之前已经切换到了数据库 B 的数据源。

示例代码如下:

@Service
public class MyService {

    @Autowired
    private DataSourceTransactionManager transactionManager;

    @Autowired
    private DataSource dataSourceA;

    @Autowired
    private DataSource dataSourceB;

    @Transactional
    public void queryData() {
        // 切换到数据库 A 的数据源
        DynamicDataSourceContextHolder.setDataSourceKey('dataSourceA');

        // 在数据库 A 中查询数据
        // ...

        // 切换到数据库 B 的数据源
        DynamicDataSourceContextHolder.setDataSourceKey('dataSourceB');

        // 在数据库 B 中查询数据
        // ...
    }
}

在配置文件中,需要配置数据源和事务管理器,以及定义 DynamicDataSourceContextHolder 用于动态切换数据源。

@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties('spring.datasource.a')
    public DataSource dataSourceA() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties('spring.datasource.b')
    public DataSource dataSourceB() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = 'transactionManager')
    public DataSourceTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    public DynamicDataSourceContextHolder dynamicDataSourceContextHolder() {
        return new DynamicDataSourceContextHolder();
    }
}

在 DynamicDataSourceContextHolder 中,使用 ThreadLocal 保存当前线程使用的数据源。

public class DynamicDataSourceContextHolder {

    private static final ThreadLocal<String> DATA_SOURCE_CONTEXT_HOLDER = new ThreadLocal<>();

    public static void setDataSourceKey(String dataSourceKey) {
        DATA_SOURCE_CONTEXT_HOLDER.set(dataSourceKey);
    }

    public static String getDataSourceKey() {
        return DATA_SOURCE_CONTEXT_HOLDER.get();
    }

    public static void clearDataSourceKey() {
        DATA_SOURCE_CONTEXT_HOLDER.remove();
    }
}

通过以上配置和代码,可以在一个方法中先查询数据库 A,再查询数据库 B,并且确保在查询数据库 B 时使用的是数据库 B 的数据源。


原文地址: https://www.cveoy.top/t/topic/o5eQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录