我已经在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();
}
}
没有它使用JDBC批处理更新来批量提交多个SQL语句。性能优势来自减少通信开销,而不是来自(客户端)并行性。
如果您执行一次单个SQL更新语句的序列N次,则客户端步骤是这样的:
JDBC执行调用
向服务器发送一条SQL语句
- 等待数据库处理SQL
- 从包含一个计数的服务器接收响应
- JDBC执行调用返回
- 转到步骤1 ...,直到完成N次。
这里的瓶颈是发送SQL,等待数据库处理请求并接收响应,并进行所有这N次操作。 如果您批量执行多个SQL更新语句 JDBC executeBatch调用
将N条SQL语句作为一个请求发送到服务器
- 等待数据库处理所有N条SQL语句
- 从包含所有N个计数的服务器接收响应
- JDBC executeBatch调用返回
仍然存在瓶颈。但是: 与包含相同SQL语句或计数的N条小消息相比,发送1条大消息要快。这是因为网络数据包将包含更多有用的信息,部分原因是确认的粒度将更粗糙。
数据库可能潜在地并行处理多个SQL语句。
由于数据库在批处理中接收到大量语句,因此它可能
schedule更有效率。] >> 相反,如果要运行多个客户端线程,每个客户端线程都具有自己的JDBC连接,并且每个线程都发送单个SQL语句。
您无法获得网络效率,因为每个JDBC连接将使用单独的TCP / IP连接
该数据库将能够处理并行的SQL
数据库也无法安排语句,因为在任何连接上都看不到“下一步”。