目前我有一个看起来像这样的对象(还有其他成员变量):
public class Parent {
private Set<Child> children = new HashSet<Child>;
@OneToMany(cascade = { CascadeType.PERSIST,
CascadeType.MERGE }, fetch = FetchType.LAZY)
public Set<Child> getChildren() {
return children;
}
public setChildren(Set<Child> children) {
this.children = children;
}
}
然后 Child 类也有对它自己的孩子的引用,以及它的 Parent 对象。它的每个子对象也有一个对其拥有的 Child 对象的引用。
我意识到这是很多循环引用,但在这一点上,改变模型并不可行:(
对于持久性,我有以下内容:
private void persist(List<Parent> parents) {
synchronized(parentDAO) {
parentDao.startTx();
try {
for ( Parent parent : parents ) {
parentDao.merge( parent );
} catch (Exception e) {
parentDao.rollback();
}
parentDao.commit();
}
parentDao 本质上只是包装了不同的实体管理器函数(即 parentDao.startTx() 调用 EntityManager.getTransaction().begin() , parentDao.merge() 调用 EntityManager.merge() 等)。
我正在尝试合并一个大小为 11,000+ 的父级。合并需要 7 多个小时,我需要尽可能减少它,因为我有大量的数据库操作需要在一夜之间运行,而这一次调用占用了我分配的大部分时间。
我有哪些加快此操作的选项?我知道通过将 Set 分解为更小的集合(我的同事建议一次 100 个 Child 对象)并调用 parentDao.merge(Set) 来减少工作单元是一种选择,但这实际上会加快整个操作吗?有没有其他方法可以加快这个操作?任何手动操作,如生成数据库转储和运行脚本都是不可能的,因为这个过程应该每周在一堆不同的环境中运行。
我们使用 Oracle 作为我们的数据库,我们使用的是 Hibernate 3.6.6。
谢谢!!