2011-10-25 68 views
1

雖然這裏還有其他類似的問題,但我沒有看到任何解決所有問題的方法,或者有一個很好的明確答案。本質上,我正在使用Hibernate支持的JPA構建J2EE應用程序中的數據訪問和服務層。使用JPA和Hibernate進行高效的批量/批量插入的確定方法?

該應用程序執行大量數據加載/更新操作,並且我想確保它們儘可能高效地進入數據庫。正確的答案會解釋,有代碼,如何消耗大量收集插入,更新數據,最好合並

  • 設置在配置或代碼批量大小受到尊重,以及如何使用的代碼到JPA(如果可能,不使用原生Hibernate)
  • 如何以及何時使用JPA事務性命令/註釋來確保高效的內存/第一/第二級緩存使用。
  • 向我解釋這是什麼意思'如果你使用身份標識符生成器,​​Hibernate禁止在JDBC級別上插入批處理 - 這是否與使用主標識符序列相關?
  • 任何我應該知道的陷阱。

注意我問關於Hibernate和J2EE/JPA的一些相關問題,如果您還有什麼要補充這些請不要

兩者都是相對較新的技術給我(見我的其他問題):

How should EntityManager be used in a nicely decoupled service layer and data access layer?

Should raw Hibernate annotated POJO's be returned from the Data Access Layer, or Interfaces instead?

回答

3

我可以解釋有關使用身份生成器時Hibernate禁用批插入的聲明。

爲了讓Hibernate使用標識生成器獲取新實體的標識符,它必須實際執行對數據庫的插入,然後執行select來獲取該標識符值,因爲該值是由Insert上的數據庫分配的。這與使用序列發生器相反。在這種情況下,Hibernate可以在前面獲取儘可能多的標識符(如果需要,可以批量分配),並將它們分配給它們在插入之前插入的實體。

所以區別在於插入然後選擇身份生成器與選擇然後插入序列。

因此,當使用身份生成器時,Hibernate必須逐個執行插入操作,但在使用序列生成器時可以對其進行批處理。

+0

很好的解釋,謝謝 – Peter