最大 JDBC 批大小是多少?
2022-09-03 06:58:31
我有一个列表,这个列表不断增加。我正在根据列表大小添加批处理。我忘了在指定大小下限制执行Batch。
程序正在运行数小时。我现在不想停止,修复并重新开始。
我的问题是,什么决定了添加批的大小?一次要执行的批处理的最大容量是多少?我可以使用多少时间而不做?executeBatch()
addBatch
executeBatch()
我有一个列表,这个列表不断增加。我正在根据列表大小添加批处理。我忘了在指定大小下限制执行Batch。
程序正在运行数小时。我现在不想停止,修复并重新开始。
我的问题是,什么决定了添加批的大小?一次要执行的批处理的最大容量是多少?我可以使用多少时间而不做?executeBatch()
addBatch
executeBatch()
PgJDBC 在批处理方面有一些限制:
所有请求值和所有结果都必须累积在内存中。这包括大型 blob/clob 结果。因此,可用内存是批大小的主要限制因素。
在 PgJDBC 9.4(尚未发布)之前,返回生成的密钥的批处理始终对每个条目执行一次往返,因此它们并不比单个语句执行更好。
即使在 9.4 中,返回生成的键的批处理也只有在生成的值有大小限制时才提供好处。请求结果中的单个文本
、bytea
或无约束 varchar
字段将强制驱动程序对每次执行执行执行一次往返。
批处理的好处是减少了网络往返。因此,如果您的数据库是应用服务器的本地数据库,那么意义就小得多。随着批大小的增加,回报会逐渐减少,因为在网络等待中花费的总时间会迅速下降,因此尝试使批尽可能大通常不是工作。
如果要批量加载数据,请认真考虑改用 API,通过 PgJDBC 通过接口获取。它允许您将类似CSV的数据流式传输到服务器,以便快速批量加载,只需很少的客户端/服务器往返。不幸的是,它的记录非常不足 - 它根本没有出现在主要的PgJDBC文档中,只出现在API文档中。COPY
CopyManager
PgConnection
AFAIK除了内存问题之外没有限制。关于您的问题:语句仅在执行批处理时发送到数据库,因此直到您执行批处理之前,内存将继续增长,直到您将获得JavaHeapSpace或批处理将被发送到数据库。