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



我有一个列表,该列表不断增加。我正在做添加批次取决于列表大小。我忘了在指定大小中设置do executeBatch的限制。

程序正在运行数小时。我现在不想停下来,修复并重新开始。

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

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

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

  • 在PgJDBC 9.4(尚未发布)之前,返回生成密钥的批处理总是对每个条目进行往返,因此它们并不比单独的语句执行好。

  • 即使在9.4中,返回生成的密钥的批也只有在生成的值大小有限的情况下才有好处。请求结果中的单个textbytea或不受约束的varchar字段将强制驱动程序为每次执行进行往返。

批处理的好处是减少了网络往返。因此,如果你的数据库是应用服务器的本地数据库,那么就没有那么重要了。随着批量大小的增加,回报率会递减,因为网络等待所花费的总时间会很快减少,所以在努力使批量尽可能大的情况下,这通常是行不通的。

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

AFAIK除了内存问题之外没有任何限制。关于您的问题:该语句仅在执行批处理时发送到DB,因此在您执行批处理之前,内存将继续增长,直到您获得JavaHeapSpace或批处理将发送到DB。

根据JDBC实现的不同,可能会有最大数量的参数标记。

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

最新更新