Java Jooq批记录插入

Java Jooq批记录插入,java,database,postgresql,bulkinsert,jooq,Java,Database,Postgresql,Bulkinsert,Jooq,我目前正试图批量插入许多记录(~2000条),而Jooq的batchInsert并不是我想要的 我将POJO转换为可更新记录,然后执行batchInsert,这是对每个记录执行insert。因此,Jooq对每个批插入进行了约2000次查询,这会降低数据库性能 它正在执行以下代码(jooq的批插入): 而不是: jooq.batchInsert(records).execute(); 如何让Jooq以批处理模式创建新记录?我是否应该将记录转换为绑定查询,然后调用batchInsert?有什么想法

我目前正试图批量插入许多记录(~2000条),而Jooq的batchInsert并不是我想要的

我将POJO转换为可更新记录,然后执行batchInsert,这是对每个记录执行insert。因此,Jooq对每个批插入进行了约2000次查询,这会降低数据库性能

它正在执行以下代码(jooq的批插入):

而不是:

jooq.batchInsert(records).execute();
如何让Jooq以批处理模式创建新记录?我是否应该将记录转换为绑定查询,然后调用batchInsert?有什么想法吗?;)

jOOQ使用相同的生成的SQL字符串为每组连续记录创建一个JDBC批处理语句(遗憾的是,Javadoc没有正式定义这一点)

当您的记录如下所示时,这可能会变成一个问题:

+------+--------+--------+
|COL1 | COL2 | COL3|
+------+--------+--------+
|1*|{null}|{null}|
|2*| B*|{null}|
|3*|{null}| C*|
|4*D*D*|
+------+--------+--------+
。。因为在这种情况下,生成的SQL字符串如下所示:

插入到t(col1)值(?);
插入t(col1,col2)值(?,);
插入t(col1,col3)值(?,);
插入t(col1,col2,col3)值(?,?);
这种违约行为的原因是,这是保证<代码>默认值行为。与SQL中的默认值一样

考虑到这一点,并且由于每个连续的SQL字符串都是不同的,很遗憾,插入并没有像您预期的那样作为单个批进行批处理

解决方案1:确保所有更改的标志均
true
强制所有
INSERT
语句相同的一种方法是将每个单独记录的所有更改标志设置为
true

for(记录r:记录)
r、 改变(真);
现在,所有SQL字符串都将是相同的

解决方案2:使用
Loader
API 您可以导入数据(并在其中指定批量大小),而不是批处理。有关详细信息,请参阅手册中有关导入记录的部分:

解决方案3:改用批处理语句 使用
batchInsert()
非常方便,在使用
TableRecords
时非常方便。当然,您可以手动生成
INSERT
语句,并使用jOOQ的批处理语句API批处理各个绑定变量:

关于性能的说明 关于
DSLContext.batchInsert()
和类似的API,有几个尚未解决的问题。为每个记录生成SQL字符串的客户端算法效率低下,将来可能会更改,直接依赖
changed()
标志。一些相关问题:


解决方案2有效。Jooq正在创建批量插入,但它并没有加快整个过程。无论如何,谢谢你;)@你试过使用批量、批量和提交大小吗?只使用批量大小。要更改提交大小,我需要禁用自动提交。也许我会稍后再试。@hya:哦,是的,你不应该提交每个插入。通常,1000行的提交大小在某些数据库上会有所帮助。
records.forEach(UpdatableRecord::insert);
jooq.batchInsert(records).execute();