Spring Boot查多数据源,CountDownLatch

一、Spring Boot配置多数据源:
1.application.yml中配置多个数据库链接:
 

spring:
  datasource:
    ds_0:
      driverClassName: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1/demo_ds_0?characterEncoding=UTF-8
      username: root
      password: 123456
    ds_1:
      driverClassName: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1/demo_ds_1?characterEncoding=UTF-8
      username: root
      password: 123456
    ds_2:
      driverClassName: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1/demo_ds_2?characterEncoding=UTF-8
      username: root
      password: 123456

2.增加数据源配置文件:

@Configuration
@MapperScan(basePackages = "com.kevin.mapperds0")
public class Datasource0 {
    // 注入数据源配置
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.ds_0")
    public DataSourceProperties sqlServerDataSourceProperties() {
        return new DataSourceProperties();
    }

    // 创建数据库连接
    @Bean
    public DataSource sqlServerDataSource() {
        return sqlServerDataSourceProperties().initializeDataSourceBuilder().build();
    }
}

注意:写3个类似这样的类,内容中basePackages = "com.kevin.mapperds0",prefix = "spring.datasource.ds_0"作相应修改,对应各自mapper文件、数据库配置。每个数据源都有相应的mapper文件、实体类。

二、建立线程池,使用CountDownLatch进行查询,同时查询多个数据库,然后合并结果集:
 

@Service
public class SpringBootService {
    static final ExecutorService es = new ThreadPoolExecutor(3, 6, 60, TimeUnit.SECONDS, new LinkedBlockingQueue());
    @Resource
    private CityMapperDS0 cityMapperDS0;
    @Resource
    private CityMapperDS1 cityMapperDS1;
    @Resource
    private CityMapperDS2 cityMapperDS2;

    public List multipleQuery(){
        CountDownLatch cdl = new CountDownLatch(3);
        QueryDS queryDS0 = new QueryDS(cityMapperDS0, cdl);
        Future> f0 = es.submit(queryDS0);

        QueryDS queryDS1 = new QueryDS(cityMapperDS1, cdl);
        Future> f1 = es.submit(queryDS1);

        QueryDS queryDS2 = new QueryDS(cityMapperDS2, cdl);
        Future> f2 = es.submit(queryDS2);

        List resultList = new ArrayList();
        try {
            cdl.await();
            List cityList0 = f0.get();
            List cityList1 = f1.get();
            List cityList2 = f2.get();

            resultList.addAll(cityList0);
            resultList.addAll(cityList1);
            resultList.addAll(cityList2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        return resultList;
    }

    class QueryDS implements Callable> {
        private CityDatasource cityDatasource;
        private CountDownLatch countDownLatch;
        public QueryDS(CityDatasource cityDatasource, CountDownLatch countDownLatch){
            this.cityDatasource = cityDatasource;
            this.countDownLatch = countDownLatch;
        }
        @Override
        public List call() throws Exception {
            List cityList = cityDatasource.queryCity();
            countDownLatch.countDown();
            return cityList;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值