0

目前我有一个看起来像这样的对象(还有其他成员变量):

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。

谢谢!!

4

0 回答 0