我正在用jdbc批量更新

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

但在后台,prosgres驱动程序似乎会一点一点地将查询发送到数据库。
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版)会向服务器发送成批查询。它只是在发送缓冲区中对一堆查询进行排队,而不是在每个查询之后与服务器同步。
见:
Issue #15: Enable batching when returning generated keys
Issue #195: PgJDBC does not pipeline batches that return generated keys
即使在请求生成的键时,extended query protocol也被用来确保查询文本不需要每次都被发送,只需要发送参数。
坦白地说,JDBC批处理在任何情况下都不是一个好的解决方案。对于应用程序开发人员来说,这很容易使用,但对于性能来说,这是次优的,因为服务器仍然必须单独执行每个语句—尽管只要使用准备好的语句,就不能单独分析和计划它们。
如果autocommit处于启用状态,性能将非常糟糕,因为每个语句都会触发提交。即使autocommit关闭了,运行许多小语句也不会特别快,即使您可以消除往返延迟。
对于许多简单的UPDATEs,一个更好的解决方案是:
COPY将新数据放入TEMPORARYUNLOGGED表中;以及
对复制的表使用UPDATE ... FROMUPDATEJOIN
有关复制,请参见the PgJDBC docsthe COPY documentation in the server docs
你经常会发现,你可以调整一些东西,这样你的应用就不必发送所有的个人信息。

10-04 13:50