[英]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 次,客户端的步骤是这样的:
这里的瓶颈是,发送SQL,等待数据库处理请求并接收响应,这些都做了N次。
如果批量执行多个 SQL 更新语句
仍然存在瓶颈。 然而:
发送 1 条大消息比发送包含相同 SQL 语句或计数的 N 条小消息更快。 这是因为:
数据库可能会并行处理多个 SQL 语句。
由于数据库在批处理中接收大量语句,因此它可以潜在地更有效地调度它们。
相比之下,如果您要运行多个客户端线程,每个线程都有自己的 JDBC 连接,并且每个线程都发送单个 SQL 语句。
你没有得到网络效率......因为每个 JDBC 连接将使用单独的 TCP/IP 连接
数据库将能够处理 SQL 是并行的
数据库也无法安排语句,因为它无法在任何连接上看到“接下来会发生什么”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.