【发布时间】:2017-03-14 13:53:34
【问题描述】:
我需要向具有多个嵌套对象的数据库插入一个对象,例如:
class A{
List<B> b;
}
class B{
List<C> c;
List<D> d;
List<E> e;
}
现在我将有一个 A 的对象来持久化,该对象将具有多个 B 类型的对象,而 B 又将具有多个 C、D 和 E 类型的对象。
总共可能有 10,000 个 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>
我也加了
rewriteBatchedStatements=true
在hibernate的connection.url属性中。
我正在为 id 使用 increment 生成器。 我将收到 A 的 json 以及 B 的嵌套列表,并在每个 B 元素中依次嵌套 C、D 和 E。这将转换为对象 A 并使用
保存到数据库中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 批量大小插入之后。我不确定在我的情况下该怎么做,我也尝试过使用无状态会话,我也没有看到任何改进。关于如何提高性能的任何建议都会很棒。
【问题讨论】:
标签: java mysql hibernate batch-processing