如何加速Hibernate merge()?

时间:2013-06-24 18:19:35

标签: oracle hibernate jpa

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

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个多小时,我需要尽可能地减少它,因为我有大量的数据库操作需要在一夜之间运行,而这一次调用占用了我指定时间的大部分时间。 / p>

我有什么选择来加快这项行动?我知道通过分解设置为较小的集合来减少工作单元(我的同事一次建议100个Child对象)并且调用parentDao.merge(Set)是一个选项,但这实际上会加速整个操作吗?还有其他方法来加快这项行动吗?任何手动操作(如生成数据库转储和运行脚本)都是不可能的,因为此过程应该在一堆不同的环境中每周运行一次。

我们使用Oracle作为我们的数据库,我们使用的是Hibernate 3.6.6。

谢谢!

0 个答案:

没有答案