Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jdbctemplate.batchupdate是多线程的还是并发的?_Java_Multithreading_Spring Boot_Jdbctemplate - Fatal编程技术网

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

Java jdbctemplate.batchupdate是多线程的还是并发的?,java,multithreading,spring-boot,jdbctemplate,Java,Multithreading,Spring Boot,Jdbctemplate,我已经用Informix数据库在spring boot最新版本中开发了一个应用程序。有一些我想并行执行的任务。我有以下问题 jdbcTemplate.batchupdate()是通过线程并行化查询,还是通过异步编程并发运行查询,还是只是逐个顺序执行查询 private String query1, query2, query3; public void executeQuery(JdbcTemplate jdbctemplate) { jdbctemplate.batchupda

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

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();
        }
}
private void executeInThread(){
ExecutorService sommutExecutorService=Executors.newCachedThreadPool();
final CompletableFuture-future1=CompletableFuture.supplyAsync(()->jdbcTemplate.update(query1),sommutExecutorService);
final CompletableFuture-future2=CompletableFuture.supplyAsync(()->jdbcTemplate.update(query2),sommutExecutorService);
final CompletableFuture-future3=CompletableFuture.supplyAsync(()->jdbcTemplate.update(query3),sommutExecutorService);
试一试{
CompletableFuture.allOf(future1、future2、future3)。然后运行(()->execute()).get();
}捕获(中断异常|执行异常e){
日志(如getMessage());
}最后{
sommutExecutorService.shutdown();
}
}
jdbcTemplate.batchupdate()是否通过线程并行化查询

不可以。它使用JDBC批量更新将多个SQL语句作为一个批提交

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

如果执行单个SQL update语句序列N次,客户端步骤如下:

  • JDBC执行调用
  • 向服务器发送一条SQL语句
  • 数据库正在处理SQL语句,请稍候
  • 从服务器接收包含一个计数的响应
  • JDBC执行调用返回
  • 转到步骤1。。。直到你做了N次
  • 这里的瓶颈是,发送SQL、等待数据库处理请求和接收响应,以及执行所有这些N次

    如果批量执行多个SQL update语句

  • JDBC executeBatch调用
  • 将N个SQL语句作为一个请求发送到服务器
  • 数据库正在处理所有N条SQL语句,请稍候
  • 从服务器接收包含所有N个计数的响应
  • JDBC executeBatch调用返回
  • 仍然存在瓶颈。然而:

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

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

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


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

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

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

    • 数据库也无法调度语句,因为它无法在任何连接上看到“下一步是什么”

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

    不可以。它使用JDBC批量更新将多个SQL语句作为一个批提交

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

    如果执行单个SQL update语句序列N次,客户端步骤如下:

  • JDBC执行调用
  • 向服务器发送一条SQL语句
  • 数据库正在处理SQL语句,请稍候
  • 从服务器接收包含一个计数的响应
  • JDBC执行调用返回
  • 转到步骤1。。。直到你做了N次
  • 这里的瓶颈是,发送SQL、等待数据库处理请求和接收响应,以及执行所有这些N次

    如果批量执行多个SQL update语句

  • JDBC executeBatch调用
  • 将N个SQL语句作为一个请求发送到服务器
  • 数据库正在处理所有N条SQL语句,请稍候
  • 从服务器接收包含所有N个计数的响应
  • JDBC executeBatch调用返回
  • 仍然存在瓶颈。然而:

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

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

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


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

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

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

    • 数据库也无法调度语句,因为它无法在任何连接上看到“下一步是什么”


    它是连续的。因为大多数批处理往往是出于性能原因。它是顺序的。正如大多数b