【问题标题】:Hibernate saveOrUpdate large data休眠保存或更新大数据
【发布时间】:2013-06-09 14:45:56
【问题描述】:

我正在尝试使用 Hibernate 插入或更新大型数据。我有一个包含 350k 个对象的列表,当我使用 Hibernate saveOrUpdate() 时,插入所有数据需要几个小时。

我正在使用下面的代码进行此操作。我的开发环境是JDK1.4和Oracle数据库。

public void saveAll(List list)throws HibernateException{
    Session session = HibernateUtil.getEYSSession();
    Iterator it = list.iterator();
    int i = 0;
    while(it.hasNext()){ 
        i++;
        Object obj = it.next();
        session.saveOrUpdate(obj);
        if (i % 50 == 0) { session.flush(); session.clear(); }
    }
}

我正在使用批量更新,还设置了hibernate.jdbc.batch_size 属性 50,但它没有帮助。

我的对象与另一个对象具有一对一的关系,因此在这种情况下使用 StatelessSession 可能会出现问题。因为我认为 StatelessSession 不会级联到组合对象。

您对在这种情况下如何提高saveOrUpdate() 操作的性能有什么想法吗?

谢谢。

【问题讨论】:

  • 您使用的是哪个数据库平台,是否为您的条目自动生成标识符?
  • 我使用的是 Oracle,也没有自动生成标识符。

标签: java performance hibernate bulkinsert


【解决方案1】:

对于每个saveOrUpdate 操作,Hibernate 也会生成一个select 语句。在我看来,使用 Hibernate 的 saveOrUpdate 更新或插入大量数据根本不是一个好的选择。我建议使用存储过程或移至 SpringJDBCTemplate。

【讨论】:

    【解决方案2】:

    我发现分离必须使用 save() 方法或 Hibernate merge() 的实例提供了更好的性能。但是,我记得保存和更新了 100,000 个对象,而且也花费了相当长的时间。因此,存储过程可能是更有效的机制。

    【讨论】:

      【解决方案3】:

      您可以使用 futureTask 来完成您的数据库插入。并继续你的程序。

      这不会减少时间,但程序不会等待完成插入过程。

      【讨论】:

      • 这个答案有点断章取义。问题是关于在大量记录的情况下提高数据库相关代码的性能。您的回答肯定会提高应用性能,但不能作为解决方案。
      • 会话会话 = sessionFactory.openStatelessSession();交易 tx = session.beginTransaction();诠释 i = 0; while(it.hasNext()){ i++;对象 obj = it.next(); session.save(obj) if (i % 50 == 0) { session.flush(); session.clear();}
      • 我使用的是JDK 1.4,我使用线程来保存,但它也没有解决性能问题。
      【解决方案4】:
        Session session = sessionFactory.openStatelessSession();
        Transaction tx = session.beginTransaction();
        int i = 0;
        while(it.hasNext()){ 
          i++;
          Object obj = it.next();
          session.save(obj) 
          if (i % 50 == 0) { session.flush(); session.clear();}
      

      statelessSession 将有助于提高性能。

      【讨论】:

      • 谢谢,但我忘了提到我的对象与另一个对象是一对一的关系,所以在这种情况下使用 StatelessSession 可能是个问题。因为我认为 StatelessSession 不会级联到组合对象。
      猜你喜欢
      • 1970-01-01
      • 2012-01-18
      • 2011-09-20
      • 2014-06-10
      • 2011-11-06
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      相关资源
      最近更新 更多