使用批量数据库操作和自动增量PK

时间:2015-10-01 13:22:04

标签: hibernate jpa

实体A有一个表TA(ID int PK autoinc,f1,f2,f3)。

在Hibernate上使用JPA,我们将记录保存到A. ID字段标记为Key。我们已将批量大小设置为100,希望在将100条记录保存到存储库后,将调用物理INSERT。但是,JPA / Hibernate显然会在调用persist时立即INSERT每个记录,可能是因为它必须设置只能从DB获取的键字段的值。

这意味着当我们有一个自动增量的PK时,无法批量执行数据库操作?我是否缺少一些可以让我仍然批量执行插入的注释/配置?

插入记录后,我不需要管理实体。

谢谢,

佳日

1 个答案:

答案 0 :(得分:0)

如果您要发布正在使用的数据库引擎,那可能会很好。每个数据库实现都有自己的插件批量优化。 JPA并不是所有这些都是最新的。

我认为如果您要进行性能优化,您应该首先查看您运行的引擎/版本的数据库文档以及其中支持的内容。然后查看您正在使用的JPA实现(如OpenJPA或Hibernate?),如果它们支持这种语法。

我尝试过多次使用JPA的批处理参数,问题是此批量更新仍然很慢。通常,DB供应商提供多种插入语法替代方案,然后由JPA支持。 JPA的批量更新只是意味着所有插入都在单个事务中执行。但它不使用DB供应商特定的优化SQL。

示例:MSSQL支持每个插入语句多个tupples(我认为最多1000个)。

所以而不是

INSERT INTO [my.[dbo].[entity]
       ([col1], [col2], [col3])
VALUES ('val1a','val2a','val3a');
INSERT INTO [my.[dbo].[entity]
       ([col1], [col2], [col3])
VALUES ('val1b','val2b','val3b');

您可以执行以下操作:

INSERT INTO [my.[dbo].[entity]
       ([col1], [col2], [col3])
VALUES ('val1a','val2a','val3a')
      ,('val1b','val2b','val3b');

后一个语句比执行前两个插入要快得多。此外,如果您通过JPA的“批量更新”

将单个交易中的前两个捆绑在一起

但是大多数JPA实现都不支持后一种语法,因此我必须编写一个本机查询来实现。每个数据库供应商都有更多性能优化的导入/插入/更新方式。你不会在JPA实现中找到它们。

因此,我宁愿首先决定要实现的性能优化,然后编写本机sql查询并通过JPA执行,而不是尝试进行JPA注释/ JPQL查询工作。每个JPA实现都有执行本机查询的方法。