【问题标题】:What is the max JDBC batch size?最大 JDBC 批处理大小是多少?
【发布时间】:2014-01-19 23:03:44
【问题描述】:

我有一个列表,并且该列表不断增加。我正在添加批次取决于列表大小。我忘记在指定大小中设置 do executeBatch 的限制。

程序运行了几个小时。我现在不想停下来,修复并重新开始。

我的问题,是什么决定了添加批次的大小?一次执行executeBatch() 的批次的最大容量是多少?我可以使用addBatch 多少次而不使用executeBatch()

【问题讨论】:

标签: java database postgresql jdbc batch-processing


【解决方案1】:

PgJDBC 对批处理有一些限制:

批处理的好处是减少了网络往返。因此,如果您的数据库位于您的应用服务器本地,那么意义就更小了。随着批次大小的增加,收益会递减,因为网络等待所花费的总时间会迅速下降,因此尝试使批次尽可能大通常​​是没有压力的。

如果您要批量加载数据,请认真考虑改用COPY API,通过 PgJDBC 的CopyManager,通过PgConnection 接口获得。它使您可以将类似 CSV 的数据流式传输到服务器,以便以极少的客户端/服务器往返次数进行快速批量加载。不幸的是,它的文档非常少——它根本没有出现在主要的 PgJDBC 文档中,only in the API docs

【讨论】:

  • 你的意思是写“实际上有非常一点好处做批处理”?另外,您提到的客户端/服务器往返问题是否仍然适用于 v3 协议和最新的 PgJDBC 驱动程序?在我看来,org.postgresql.core.v3.QueryExecutorImpl#execute 看起来可能不会等待往返。
  • @ScottDudley 我已经根据我后来所做的工作修改了这个问题。简而言之,只有在请求生成的密钥时它才会在执行之间等待,否则它将以大块的形式发送批处理。它通过尝试猜测服务器的发送缓冲区大小和响应大小来推测每批的条目数。 It's all a bit crude and backwards, but it works
  • OP 是否理解这个答案是特定于驱动程序的(PostgreSQL)?考虑通过 JDBC 接口将答案澄清为驱动程序特定限制的解释。
【解决方案2】:

可能存在参数标记的最大数量,具体取决于 JDBC 实现。

比如PostgreSQL驱动代表参数个数as a 2-byte integer,在Java中最多为32768个。

【讨论】:

    【解决方案3】:

    AFAIK 除了内存问题之外没有限制。 关于您的问题:该语句仅在执行批处理时发送到数据库,因此在您执行批处理之前,内存将继续增长,直到您获得 JavaHeapSpace 或批处理将被发送到数据库。

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 2023-03-31
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 2011-03-29
      • 2013-02-26
      • 2012-06-30
      • 2011-03-13
      相关资源
      最近更新 更多