繁体   English   中英

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

[英]Is jdbctemplate.batchupdate multithreaded or concurrent?

我在 spring 启动最新版本的 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();
        }
}

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

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

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

如果你执行一个序列的单个 SQL 更新语句 N 次,客户端的步骤是这样的:

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

这里的瓶颈是,发送SQL,等待数据库处理请求并接收响应,这些都做了N次。

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

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

仍然存在瓶颈。 然而:

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

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

  • 由于数据库在批处理中接收大量语句,因此它可以潜在地更有效地调度它们。


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

  • 你没有得到网络效率......因为每个 JDBC 连接将使用单独的 TCP/IP 连接

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

  • 数据库也无法安排语句,因为它无法在任何连接上看到“接下来会发生什么”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM