我正在尝试使用JPA在大对象图上进行级联保存。例如(我的对象图是大了一点,但足够接近):JPA插入缓慢的对象图
@Entity
@Table(name="a")
public class A {
private long id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "a")
private Collection<B> bs;
}
@Entity
@Table(name="b")
public class B {
private long id;
@ManyToOne
private 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也冬眠。后端是oracle 11g。问题实际上是如何将sql放在一起。这些操作中的每一个都是分散完成的,而不是批量完成,所以如果我的应用服务器和数据库服务器之间的网络延迟为5毫秒,则执行200次离散操作会增加1秒。我试过增加我的序列的分配大小,但只有一点帮助。我也试过直接使用JDBC作为批处理声明:
for...{
statement = connection.prepareStatement(sql);
statement.addBatch();
}
statement.executeBatch();
对于我的数据模型需要花费大约为33ms进行直接JDBC批处理。 Oracle本身对于100多个插入需要5ms。
是否有任何使JPA(我现在坚持1.0)......无需钻研供应商特定的东西,如冬眠批量插入更快?
谢谢!
感谢您的回应!将发布我在下面做的事情! – user364939 2010-06-25 15:38:08
感谢您的信息,非常好 – Greg 2011-04-06 23:23:16