jdbc 批处理性能

Posted

技术标签:

【中文标题】jdbc 批处理性能【英文标题】:jdbc batch performance 【发布时间】:2012-09-28 11:26:30 【问题描述】:

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

【问题讨论】:

PostgreSQL 版本? JDBC驱动版本?您要批处理的查询是什么?至于代码,看来你在说execute(Query[] queries, ParameterList[] parameterLists, ...) 我正在批量更新,驱动程序是“9.1-901-1.jdbc4”。我找到了复制 api。但我找不到任何关于它正在阅读的格式的文档。只是“来自 - CSV 文件等”jdbc.postgresql.org/documentation/publicapi/org/postgresql/copy/… 复制命令应该是 Postgres 通常使用的 COPY 的包装器。有关格式和命令的更多信息:postgresql.org/docs/9.1/static/sql-copy.html 归档:github.com/pgjdbc/pgjdbc/issues/15 【参考方案1】:

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

见:

Issue #15: Enable batching when returning generated keys Issue #195: PgJDBC does not pipeline batches that return generated keys

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

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

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

对于很多简单的UPDATEs,一个更好的解决方案可以是:

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

对于 COPY,请参阅 the PgJDBC docs 和 the COPY documentation in the server docs。

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

【讨论】:

以上是关于jdbc 批处理性能的主要内容,如果未能解决你的问题,请参考以下文章

SQLServer jdbc 批量执行性能

使用jdbc操作时,如何提取数据的性能

JDBC批量处理

用JDBC操作MySQL——大量数据库操作时使用批处理提速

Spring Integration Aggregator + JDBC Message Store 性能

读Java性能权威指南(第2版)笔记05_数据库性能JDBC