jdbctemplate.batchupdate是多线程还是并发?

时间:2019-11-12 11:26:14

标签: java multithreading spring-boot jdbctemplate

我已经在Spring Boot的最新版本中使用Informix数据库开发了一个应用程序。有一些我想并行执行的任务。我有以下问题。

jdbcTemplate.batchupdate()是否通过线程并行化查询,通过异步编程并发运行它们,还是只是一个接一个地顺序执行它们?

private  String query1, query2, query3;

public void executeQuery(JdbcTemplate jdbctemplate) {
      jdbctemplate.batchupdate(query1, query2, query3)
}

我确实在线程中执行了它们,但是我发现性能没有区别。 知道为什么吗?

private void executeInThread(){
ExecutorService sommutExecutorService = Executors.newCachedThreadPool();
        final CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> jdbcTemplate.update(query1), sommutExecutorService);
        final CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> jdbcTemplate.update(query2), sommutExecutorService);
        final CompletableFuture<Integer> future3 = CompletableFuture.supplyAsync(() -> jdbcTemplate.update(query3), sommutExecutorService);

        try {
            CompletableFuture.allOf(future1, future2, future3).thenRun(() -> execute()).get();
        } catch (InterruptedException | ExecutionException e) {
            log(e.getMessage());
        }finally {
            sommutExecutorService.shutdown();
        }
}

1 个答案:

答案 0 :(得分:1)

  

jdbcTemplate.batchupdate()是否通过线程并行化查询?

不。它使用JDBC批处理更新来批量提交多个SQL语句。

性能优势来自减少通信开销,而不是来自(客户端)并行性。

如果您执行N次单个SQL更新语句的序列,则客户端步骤如下:

  1. JDBC执行调用
  2. 向服务器发送一条SQL语句
  3. 在数据库处理SQL时等待
  4. 从服务器接收包含一个计数的响应
  5. JDBC执行调用返回
  6. 转到步骤1 ...,直到完成N次。

这里的瓶颈是发送SQL,等待数据库处理请求并接收响应,然后进行所有这N次操作。

如果您批量执行多个SQL更新语句

  1. JDBC executeBatch调用
  2. 将N条SQL语句作为一个请求发送到服务器
  3. 等待数据库处理所有N条SQL语句
  4. 从服务器接收包含所有N个计数的响应
  5. JDBC executeBatch调用返回

仍然存在瓶颈。但是:

  • 与包含相同SQL语句或计数的N条小消息相比,发送1条大消息要快。这是因为:

    • 网络数据包将包含更多有用的信息,
    • 确认的粒度较粗,因此
    • 减少了网络往返延迟。
  • 数据库有可能并行处理多个SQL语句。

  • 由于数据库在批处理中接收了大量语句,因此有可能计划更高效。


相比之下,如果要运行多个客户端线程,每个客户端线程都有自己的JDBC连接,并且每个线程都发送一条SQL语句。

  • 您无法获得网络效率...因为每个JDBC连接都将使用单独的TCP / IP连接

  • 数据库将能够并行处理SQL

  • 数据库也将无法安排语句,因为在任何连接上都无法看到“下一步”。