一、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; } } }