我正在嘗試使用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