实体A有一个表TA(ID int PK autoinc,f1,f2,f3)。
在Hibernate上使用JPA,我们将记录保存到A. ID字段标记为Key。我们已将批量大小设置为100,希望在将100条记录保存到存储库后,将调用物理INSERT。但是,JPA / Hibernate显然会在调用persist时立即INSERT每个记录,可能是因为它必须设置只能从DB获取的键字段的值。
这意味着当我们有一个自动增量的PK时,无法批量执行数据库操作?我是否缺少一些可以让我仍然批量执行插入的注释/配置?
插入记录后,我不需要管理实体。
谢谢,
佳日
答案 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实现都有执行本机查询的方法。