JDBC批处理的最大大小是多少?

16

我有一个列表,这个列表在不断增长。根据列表的大小,我正在执行批量添加。我忘记了为do executeBatch设置限制的指定大小。

程序已经运行了几个小时。我现在不想停止、修复和重新启动。

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


1
在我看来,除了内存大小以外并没有实际的限制。你可能想查一下这个链接 - https://dev59.com/OmjWa4cB1Zd3GeqPv_o3。 - Pavel Horal
3个回答

12

PgJDBC在批处理方面有一些限制:

批量处理的好处是减少网络往返次数。因此,如果您的数据库位于应用服务器本地,则几乎没有意义。随着批处理大小的增加,总等待时间快速减少,因此通常没有必要努力使批处理尽可能大。

如果您正在批量加载数据,请认真考虑使用COPY API,通过PgJDBC的CopyManager(通过PgConnection接口获得)。它允许您将类似CSV的数据流式传输到服务器,以进行快速的批量加载,并且客户端/服务器往返非常少。不幸的是,它的文档相当简略 - 在主要的PgJDBC文档中根本没有出现,只有在API文档中


你是不是想写“批处理实际上几乎没有什么好处”?此外,你提到的客户端/服务器往返问题是否仍然存在于v3协议和最新的PgJDBC驱动程序中?在我看来,org.postgresql.core.v3.QueryExecutorImpl#execute似乎可能不会等待往返。 - Scott Dudley
@ScottDudley 根据我后来的工作,我修改了问题。简而言之,只有在请求生成的键时,它才会在执行之间等待,否则它将以大块发送批处理。它通过尝试猜测服务器的发送缓冲区大小和响应大小来估计每个批次的条目数量。虽然有些粗糙和反向,但它确实有效 - Craig Ringer
OP了解这个答案是针对特定驱动程序(PostgreSQL)的吗?考虑通过JDBC接口澄清回答的具体限制说明。 - Martin

2
“可能会根据JDBC实现而存在参数标记的最大数量限制。”
“例如,PostgreSQL驱动程序将参数的数量表示为2字节整数,在Java中最多为32768。”

2
据我所知,除了内存问题外,没有任何限制。关于你的问题:该语句只有在执行批处理时才会发送到数据库,因此在执行批处理之前,内存将继续增长,直到出现JavaHeapSpace错误或批处理被发送到数据库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接