2012-09-07 172 views
1

更新我使用的是類AbstractSimpleGenericDao類似形式 http://code.google.com/p/struts2-jquery/source/browse/showcase-grid/src/com/jgeppert/struts2/jquery/grid/showcase/dao/AbstractSimpleGenericDao.java?r=322批量插入/使用Hibernate

MyDAO擴展此類。 我有數千個我想要冬眠的對象。我是否每次都調用MyDAO.save(對象)。這對我來說似乎非常低效。這是否會導致數據庫每次都被擊中?是否有任何方法可以同時插入大量對象?s

回答

4

您確實必須調用要保存到數據庫的每個項目的保存。值得注意的是,Hibernate是一個ORM。它可以用於批量插入,但它通常不是最有效的方法。

如果您還沒有閱讀Hibernate手冊的this章節,那肯定值得。在這裏有一些有用的技巧,關於保持會話很小以避免大量髒檢查等。如果您只是插入1000個對象而不刪除任何先前的對象,則操作會變得越來越慢,因爲Hibernate必須骯髒地檢查越來越多的對象。

Hibernate實際執行插入的方式被設計爲儘可能高效。可以對插入進行批處理以利用數據庫優化。值得注意的是,如果你使用基於識別的發生器,例如在MySQL上,您將失去任何批處理優勢。這是因爲Hibernate必須實際執行插入操作才能在將對象插入會話的位置生成標識符。

您可以實施替代標識符生成策略,以確保您不需要執行此操作。一種可能性可能是存儲每個實體的當前最高標識符的表格。然後Hibernate可以以適當大小的批次從該表中請求標識符。

如果您發現Hibernate速度較慢,您可以始終回退到普通的舊JDBC以執行此任務。

+0

很多感謝「自動生成密鑰失去批處理優勢」的評論。我沒有意識到這一點! :-) –