我有一个列表,该列表不断增加。我正在做依赖于列表大小的批量添加。我忘了为指定大小的executeBatch设置限制。
计划工作了几个小时。我现在不想停下来,修理并重新开始。
我的问题是,决定添加批次的大小是什么?批次一次性executeBatch()
的最大容量是多少?我没有addBatch
可以使用executeBatch()
多少次?
答案 0 :(得分:10)
PgJDBC对批次有一些限制:
所有请求值和所有结果必须在内存中累积。这包括大blob / clob结果。因此,空闲内存是批量大小的主要限制因素。
Until PgJDBC 9.4 (not yet released),batches that return generated keys always do a round trip for every entry,所以他们并不比单独的声明执行更好。
即使在9.4中,如果生成的值的大小受限,则返回生成的键的批次仅提供好处。 A single text
, bytea
or unconstrained varchar
field in the requested result will force the driver to do a round trip for every execution
批处理的好处是减少了网络往返次数。因此,如果您的数据库是您的应用服务器的本地数据,则要少得多。随着批量大小的增加,回报逐渐减少,因为网络等待所花费的总时间很快就会下降,所以通常不会强调尝试尽可能大地批量生产。
如果您正在批量加载数据,请认真考虑使用COPY
API,通过PgJDBC的CopyManager
,通过PgConnection
接口获取。它允许您将类似CSV的数据流式传输到服务器,以便通过极少的客户端/服务器往返快速批量加载。不幸的是,它的记录显着不足 - 它根本没有出现在主要的PgJDBC文档中,only in the API docs。
答案 1 :(得分:2)
AFAIK在内存问题上没有限制。 关于你的问题:语句只在执行批处理时被发送到数据库,所以在你执行批处理之前,内存将继续增长,直到你得到JavaHeapSpace或批处理将被发送到数据库。
答案 2 :(得分:2)
根据JDBC实现,可能存在最大数量的参数标记。
例如,PostgreSQL驱动程序表示参数as a 2-byte integer的数量,在Java中最多为32768。