gpt4 book ai didi

performance - jdbc 批处理性能

转载 作者:行者123 更新时间:2023-11-29 11:53:21 25 4
gpt4 key购买 nike

我正在使用 jdbc 批处理更新

ps = con.prepareStatement("");
ps.addBatch();
ps.executeBatch();

但在后台,prostgres 驱动程序似乎将查询一点一点地发送到数据库。

org.postgresql.core.v3.QueryExecutorImpl:398

 for (int i = 0; i < queries.length; ++i)
{
V3Query query = (V3Query)queries[i];
V3ParameterList parameters = (V3ParameterList)parameterLists[i];
if (parameters == null)
parameters = SimpleQuery.NO_PARAMETERS;

sendQuery(query, parameters, maxRows, fetchSize, flags, trackingHandler);

if (trackingHandler.hasErrors())
break;
}

有没有可能让他一次发送1000个来加快速度?

最佳答案

AFAIK 在 fe/be protocol 中没有服务器端批处理,所以 PgJDBC 不能使用它。更新:嗯,我错了。 PgJDBC(从 9.3 开始准确)确实向服务器发送批量查询,如果它不需要获取生成的 key 。它只是在发送缓冲区中排队一堆查询,而不是在每个单独的查询之后与服务器同步。

参见:

即使请求生成的 key ,extended query protocol用于确保不需要每次都发送查询文本,只需发送参数。

坦率地说,JDBC 批处理在任何情况下都不是很好的解决方案。对于应用程序开发人员来说,它很容易使用,但对于性能来说并不是最佳选择,因为服务器仍然必须单独执行每条语句 - 尽管不是解析计划这么长时间当您使用准备好的语句时。

如果自动提交打开,性能将非常糟糕,因为每个语句都会触发一次提交。即使关闭自动提交,即使您可以消除往返延迟,运行许多小语句也不会特别快。

许多简单的 UPDATE 的更好解决方案是:

  • COPY 新数据到TEMPORARYUNLOGGED 表中;和
  • 使用 UPDATE ... FROMUPDATEJOIN 对复制的表

对于 COPY,请参阅 the PgJDBC docsthe COPY documentation in the server docs .

您经常会发现可以进行一些调整,这样您的应用就不必发送所有这些单独的 UPDATE

关于performance - jdbc 批处理性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12639118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com