我正在尝试使用 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的集合的A。代码只是
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 放在一起。这些操作中的每一个都是离散而不是批量完成的,所以如果我的应用服务器和数据库服务器之间的网络延迟甚至为 5 毫秒,那么执行 200 次离散操作会增加 1 秒。我已经尝试增加序列的 allocationSize ,但这只会有所帮助。我还尝试将直接 JDBC 作为批处理语句:
for...{
statement = connection.prepareStatement(sql);
statement.addBatch();
}
statement.executeBatch();
对于我的数据模型,直接 JDBC 批处理大约需要 33 毫秒。Oracle 本身为 100 多个插入花费了 5 毫秒。
有没有让 JPA(我现在被 1.0 卡住......)在不深入研究供应商特定的东西(如休眠批量插入)的情况下运行得更快?
谢谢!