2016-05-18 63 views
0

我使用spring批處理來讀取和轉換樹狀實體並使用JpaItemWriter寫入Oracle數據庫。對於樹類似實體上我的意思是:帶有OneToMany層次的Spring批量批量插入

class A { 
    @OneToMany 
    List<B> bList; 
} 

class B { 
    @OneToMany 
    List<C> cList; 
} 

class C { 
    @OneToMany 
    List<D> dList; 
} 

class D { 

} 

關係的大小可以被要求在一個事務中一次持續整個實體增長速度快,但出於商業原因。與這4層次的層次結構我想知道是否可以使用一些Hibernate(首選JPA)方法調用批量插入自頂向下戰略使用彈簧JpaItemWriter堅持所有「B」實體與一次調用數據庫然後是所有「C」實體等......而不是像我的調試日誌顯示的那樣爲每個實體插入一個插入。先謝謝您的幫助。

回答

1

簡短的回答是,如果您在爲ORM實施使用Hibernate時,應該是

Hibernate Docs深入批處理here。如果配置正確,Hibernate將嘗試在每個flush()(每個塊的結尾)按實體類型對插入和更新進行排序。

你還需要確保你有以下特性集,並且不使用IDENTITY發電機爲您的ID:

<prop key="hibernate.jdbc.batch_size">50<!--or some other number--></prop> 
<prop key="hibernate.order_inserts">true</prop> 
<prop key="hibernate.order_updates">true</prop> 
<prop key="hibernate.jdbc.batch_versioned_data">true</prop> 

Red Hat example鞋怎麼做同樣的事情用一個持久性單元。

現在,所有的說法,Hibernate可能會很棘手,所以你可能想要提高BatchingBatcher類的日誌記錄以確認它實際上正在批量插入。最後,請注意任何不使用序列的實體中的saveOrUpdate()方法。如果你正在定義你自己的ID並且你的對象還沒有在會話中(它不會),Hibernate將首先發出一個針對數據庫的select,以確定是否需要insertupdate

+0

謝謝@Dean。僅供參考,在添加屬性後,我的批處理例程核心處理從11分鐘到僅1秒。 batch_size已經配置好了,所以我把值提高到100.再次感謝您的幫助:) – guilhermerama

+0

不錯!我將在任何一天提升660倍的性能 –