3

我正在使用 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个来加快速度?

4

1 回答 1

9

AFAIK 在fe/be 协议中没有服务器端批处理,因此 PgJDBC 不能使用它。. 更新:好吧,我错了。如果不需要获取生成的密钥,PgJDBC(准确到 9.3)确实会向服务器发送批量查询。它只是在发送缓冲区中排队一堆查询,而不在每个单独的查询之后与服务器同步。

看:

即使在请求生成的密钥时,扩展查询协议也用于确保不需要每次都发送查询文本,只需要发送参数。

坦率地说,JDBC 批处理在任何情况下都不是一个很好的解决方案。对于应用程序开发人员来说,它很容易使用,但性能却不是最优的,因为服务器仍然必须单独执行每个语句——尽管只要您使用准备好的语句,就不必单独解析计划它们。

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

许多 simple UPDATEs 的更好解决方案是:

  • COPY将新数据放入TEMPORARYUNLOGGED表中;和
  • 使用UPDATE ... FROMtoUPDATEJOIN复制的表

对于 COPY,请参阅PgJDBC 文档服务器文档中的文档COPY

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

于 2012-09-28T23:15:21.903 回答