什么是最大JDBC批量大小?

我有一个列表,该列表不断增加。 我正在做依赖于列表大小的批量添加。 我忘了将executeBatch的限制放在指定的大小。

计划工作了几个小时。 我现在不想停下来,修理并重新开始。

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

PgJDBC对批次有一些限制:

  • 所有请求值和所有结果必须在内存中累积。 这包括大blob / clob结果。 因此,空闲内存是批量大小的主要限制因素。

  • 直到PgJDBC 9.4(尚未发布) , 返回生成密钥的批次总是为每个条目进行往返 ,因此它们并不比单个语句执行更好。

  • 即使在9.4中,如果生成的值的大小受限,则返回生成的键的批次仅提供好处。 请求结果中的单个textbytea或无约束varchar字段将强制驱动程序为每次执行执行往返 。

批处理的好处是减少了网络往返次数。 因此,如果您的数据库是您的应用服务器的本地数据,则要少得多。 随着批量大小的增加,回报逐渐减少,因为网络等待所花费的总时间很快就会下降,所以通常不会强调尝试尽可能大地批量生产。

如果您正在批量加载数据,请认真考虑使用COPY API,通过PgJDBC的CopyManager ,通过PgConnection接口获取。 它允许您将类似CSV的数据流式传输到服务器,以便通过极少的客户端/服务器往返快速批量加载。 不幸的是,它的记录显着不足 – 它根本没有出现在主要的PgJDBC文档中, 只出现在API文档中 。

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

根据JDBC实现,可能存在最大数量的参数标记。

例如,PostgreSQL驱动程序将参数数量表示为2字节整数 ,在Java中最多为32768。