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 批处理在任何情况下都不是一个很好的解决方案。它对应用程序开发人员来说很容易使用,但对于性能来说却不是最优的,因为服务器仍然必须单独执行每个语句 - 尽管不是 parse 和 plan 它们单独这么长时间当您使用准备好的语句时。
如果启用了自动提交,性能将非常糟糕,因为每条语句都会触发一次提交。即使关闭自动提交,运行大量小语句也不会特别快,即使您可以消除往返延迟。
对于很多简单的UPDATE
s,一个更好的解决方案可以是:
COPY
将新数据放入TEMPORARY
或UNLOGGED
表中;和
使用 UPDATE ... FROM
到 UPDATE
和 JOIN
对复制的表
对于 COPY,请参阅 the PgJDBC docs 和 the COPY
documentation in the server docs。
您经常会发现可以进行一些调整,这样您的应用就不必发送所有单独的UPDATE
s。
【讨论】:
以上是关于jdbc 批处理性能的主要内容,如果未能解决你的问题,请参考以下文章