2017-03-14 67 views
0

我需要插入一個目的是具有像多個嵌套對象數據庫:Mysql的複雜對象休眠批量插入

class A{ 
    List<B> b; 
} 

class B{ 
    List<C> c; 
    List<D> d; 
    List<E> e; 
} 

現在,我將有A的一個單獨的對象,以持續,這將具有類型B的多個對象而B又將有多個C,D和E類型的對象。

總共可以有10000個B,C,D和E組合的對象。我已經配置使用下面的補充批量插入到我的hibernate.cfg.xml

<property name="hibernate.jdbc.batch_size">50</property> 
<property name="hibernate.order_inserts">true</property> 
<property name="hibernate.order_updates">true</property> 
<property name="hibernate.jdbc.batch_versioned_data">true</property> 

我還處於休眠的connection.url屬性添加

rewriteBatchedStatements=true 

我正在使用遞增生成器的id。 我將收到A的JSON以及B的嵌套列表,並且在每個B元素中嵌套C,D和E。這被轉換成一個對象,並使用

session.save(A); 

因爲,我已經啓用級聯保存到數據庫中,所有的嵌套的對象持久化到數據庫。 10,000個物體的總插入時間大約需要25秒。 如果配料啓用或不是因爲我看到這樣

insert into C(id, val) values(1,"val"); 
insert into C(id, val) values(2,"val2"); 

單一插入語句我提到了hibernate batch insert doc我不知道,它要求我

session.flush(); 
session.clear(); 

JDBC批量插入之後。我不知道我如何在我的情況下做到這一點,我也嘗試使用無狀態會話,我也沒有看到任何改進。任何關於如何提高性能的建議都會很棒。

回答

0

我覺得如果你稍微改變你的方法,你可能會在這裏提高性能。因此,而不是單個級聯保存,您可以單獨保存實體。這假定你有雙向關係聲明,如果你想要這樣做,我想你會需要。

因此,從A中刪除所有List<T>,然後自行保存A.

喜歡的東西:

session.save(a) 
session.evict(a) 

這意味着一直持續,但不再會話。然後您可以單獨保存關聯的實體:

for (B b : a.getListOfB()) { 
    b.setA(a); 
    session.save(b); 
} 

如果您願意,您可以隨後刷新並逐出或使用無狀態會話。

+0

並不真正幫助男人,事實上,它比之前慢了2-3秒 – gameOne

+0

您是否比較過每種情況下執行的SQL?這可能會爲比較方法提供一個更好的平臺。 –