我正在尝试使用JPA对大型对象图进行级联保存.例如(我的对象图有点大但足够接近):
@Entity
@Table(name="a")
public class A {
private long id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "a")
private Collection bs;
}
@Entity
@Table(name="b")
public class B {
private long id;
@ManyToOne
private A a;
}
所以我试图坚持A有100 B的集合.代码就是
em.persist(a);
问题是,它很慢.我的节省大约需要1300毫秒.我查看了生成的SQL,它非常低效.像这样的东西:
select a_seq.nextval from dual;
select b_seq.nextval from dual;
select b_seq.nextval from dual;
select b_seq.nextval from dual;
...
insert into a (id) values (1);
insert into b (id, fk) values (1, 1);
insert into b (id, fk) values (2, 1);
insert into b (id, fk) values (3, 1);
...
目前使用toplink作为持久性提供程序,但我也尝试过eclipselink和hibernate.后端是oracle 11g.问题实际上是如何将sql放在一起.这些操作中的每一个都是分散完成而不是批量完成,因此如果我的appserver和db服务器之间的网络延迟甚至达到5ms,那么执行200次离散操作会增加1秒.我已经尝试过增加我的序列的allocationSize,但这只会有所帮助.我也尝试过直接JDBC作为批处理语句:
for...{
statement = connection.prepareStatement(sql);
statement.addBatch();
}
statement.executeBatch();
对于我的datamodel,它需要大约33ms作为直接JDBC批处理.对于100个插入,Oracle本身需要5毫秒.
无论如何制作JPA(我现在正在坚持使用1.0),如果没有深入研究像hibernate批量插入这样的供应商特定的事情,那就更快了吗?
谢谢!