在spring boot中使用ThreadpoolExecutor的jdbc连接池

时间:2017-01-24 00:28:55

标签: spring-boot spring-jdbc threadpoolexecutor spring-async

我有一个运行在多个数据库中的应用程序,并且每个数据库都在所有表上运行select查询并将其转储到hadoop。

我的设计是一次创建一个数据源连接,并使用获得的连接池在多个线程中运行选择查询。完成此数据源后,关闭连接并创建新连接。

这是异步代码

@Component
public class MySampleService {

    private final static Logger LOGGER = Logger
            .getLogger(MySampleService.class);

    @Async
    public Future<String> callAsync(JdbcTemplate template, String query) throws InterruptedException {

 try {
        jdbcTemplate.query(query);
        //process the results
        return new AsyncResult<String>("success");
      }
 catch (Exception ex){
         return new AsyncResult<String>("failed");
    }    
}

这是来电者

 public String taskExecutor() throws InterruptedException, ExecutionException {
        Future<String> asyncResult1 = mySampleService.callAsync(jdbcTemplate,query1);
        Future<String> asyncResult2 = mySampleService.callAsync(jdbcTemplate,query2);
        Future<String> asyncResult3 = mySampleService.callAsync(jdbcTemplate,query3);
        Future<String> asyncResult4 = mySampleService.callAsync(jdbcTemplate,query4);

        LOGGER.info(asyncResult1.get());
        LOGGER.info(asyncResult2.get());
        LOGGER.info(asyncResult3.get());
        LOGGER.info( asyncResult4.get());

       //now all threads finished, close the connection
       jdbcTemplate.getConnection().close();
    }

我想知道这是否是一种正确的方法,或者做任何退出/优化的解决方案,我不在用。我不能使用spring-data-jpa,因为我的查询很复杂。

由于

1 个答案:

答案 0 :(得分:0)

Spring Boot docs

  

也可以使用a自动配置生产数据库连接   汇集DataSource。这是选择特定的算法   实现:

     
      
  • 我们更喜欢Tomcat池化DataSource的性能和并发性,所以如果可以的话我们总是选择它。
  •   
  • 否则,如果HikariCP可用,我们将使用它。
  •   
  • 如果Tomcat池数据源和HikariCP都不可用,并且Commons DBCP可用,我们将使用它,但我们   不建议在生产中使用。
  •   
  • 最后,如果Commons DBCP2可用,我们将使用它。
  •   
     

如果你使用spring-boot-starter-jdbc或   spring-boot-starter-data-jpa'starters'你会自动得到一个   依赖于tomcat-jdbc。

因此,您应该获得合理的默认值。