2017-03-14 45 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?这可能会为比较方法提供一个更好的平台。 –