首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jdbctemplate.batchupdate是多线程的还是并发的?

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

Stack Overflow用户
提问于 2019-11-12 11:26:14
回答 1查看 1.5K关注 0票数 0

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

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

代码语言:javascript
复制
private  String query1, query2, query3;

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

我确实在线程中删除了它们,但是我没有看到性能上的差异。知道为什么吗?

代码语言:javascript
复制
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();
        }
}
EN

回答 1

Stack Overflow用户

发布于 2019-11-13 14:34:48

通过线程并行jdbcTemplate.batchupdate()查询吗?

不是的。它使用JDBC批处理更新将多个SQL语句作为一个批处理提交。

性能的好处来自于减少通信开销,而不是(客户端)并行。

如果连续N次执行单个SQL update语句,客户端步骤如下所示:

  1. JDBC执行
  2. 发送一条SQL语句到服务器
  3. 等待,而数据库处理SQL
  4. 从包含一个计数

<代码>H 111JDBC执行调用返回H 212H 113的服务器接收响应到步骤1.直到你做了N次。

这里的瓶颈是:发送SQL、等待数据库处理请求和接收响应,并执行所有这些N次。

如果将多个SQL update语句作为批处理执行

  1. JDBC executeBatch调用
  2. 将N条SQL语句作为一个请求
  3. 等待发送给服务器,而数据库处理所有N语句
  4. 则接收来自服务器的响应,其中包含所有N个计数

<代码>H 125JDBC executeBatch调用返回H 226G 227

仍然存在瓶颈。然而:

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

代码语言:javascript
复制
- the network packets will contain more useful information, 
- the granularity of acknowledgement is coarser, and therefore
- network round trip delays are squashed.

数据库可以并行地处理多个语句。

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

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

  • ,你得不到网络效率.因为每个JDBC连接将使用一个单独的TCP/IP connection
  • The数据库来处理SQL is
  • ,所以数据库也无法调度这些语句,因为它无法在任何连接上看到“接下来会发生什么”。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58817726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档