2015-10-01 64 views
1

實體A具有表TA(ID int PK autoinc,f1,f2,f3)。使用批量數據庫操作自動增量PK

在Hibernate上使用JPA,我們將記錄保存到A.ID字段被標記爲密鑰。我們已經將批處理大小設置爲100,希望在將100條記錄保存到存儲庫後,將調用物理INSERT。但是,JPA/Hibernate在調用persist後顯然會插入每條記錄,這可能是因爲它必須設置它只能從DB獲得的關鍵字段的值。

這意味着當我們有一個自動增量的PK時,將無法批量執行數據庫操作?我是否缺少一些批註/配置可以讓我仍然批量執行插入操作?

插入記錄後我不需要管理實體。

感謝,

佳日

回答

0

這將是可能是好的,如果你發佈你所使用的數據庫引擎。每個數據庫實現對插入有自己的批處理優化。 JPA在所有這些方面並不是最新的。

我認爲如果你爲了優化性能,你應該首先檢查你運行的引擎/版本的數據庫文檔,以及它支持的是什麼。然後查看您正在使用的JPA實現(如OpenJPA或Hibernate?)是否支持此語法。

我試過使用批量參數JPA各種不同的時間,問題是這批更新仍然很慢。通常,數據庫供應商提供了多個插入語法替代方案,而JPA支持這些方法。 JPA的批量更新只是意味着所有插入操作都是在單個事務中執行的。但它不使用數據庫供應商特定的優化SQL。

示例:MSSQL支持每個插入語句多個映射(我認爲最多可達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實現中找到那些。

因此,不是試圖使JPA註釋/ JPQL查詢工作,而是首先決定要實現的性能優化,然後編寫原生SQL查詢並通過JPA執行它。每個JPA實現都有執行本機查詢的方法。