我有一个列表,该列表不断增加。我正在做添加批次取决于列表大小。我忘了在指定大小中设置do executeBatch的限制。
程序正在运行数小时。我现在不想停下来,修复并重新开始。
我的问题是,是什么决定了添加批次的大小?批次一次处理executeBatch()
的最大容量是多少?如果不使用executeBatch()
,我可以使用addBatch
多少次?
PgJDBC在批处理方面有一些限制:
-
所有请求值和所有结果都必须累积在内存中。这包括大的blob/clob结果。因此,空闲内存是批量大小的主要限制因素。
-
在PgJDBC 9.4(尚未发布)之前,返回生成密钥的批处理总是对每个条目进行往返,因此它们并不比单独的语句执行好。
-
即使在9.4中,返回生成的密钥的批也只有在生成的值大小有限的情况下才有好处。请求结果中的单个
text
、bytea
或不受约束的varchar
字段将强制驱动程序为每次执行进行往返。
批处理的好处是减少了网络往返。因此,如果你的数据库是应用服务器的本地数据库,那么就没有那么重要了。随着批量大小的增加,回报率会递减,因为网络等待所花费的总时间会很快减少,所以在努力使批量尽可能大的情况下,这通常是行不通的。
如果您正在批量加载数据,请认真考虑使用COPY
API,通过PgJDBC的CopyManager
,通过PgConnection
接口获得。它允许您将类似CSV的数据流式传输到服务器,以便在很少的客户端/服务器往返行程中快速批量加载。不幸的是,它的文档非常少——它根本没有出现在主要的PgJDBC文档中,只出现在API文档中。
AFAIK除了内存问题之外没有任何限制。关于您的问题:该语句仅在执行批处理时发送到DB,因此在您执行批处理之前,内存将继续增长,直到您获得JavaHeapSpace或批处理将发送到DB。
根据JDBC实现的不同,可能会有最大数量的参数标记。
例如,PostgreSQL驱动程序将参数的数量表示为2字节整数,在Java中最多为32768。