Hibernate saveOrUpdate大数据

时间:2013-06-13 09:11:07

标签: java performance hibernate bulkinsert

我正在尝试使用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()操作的性能有任何想法吗?

感谢。

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以使用futureTask完成数据库插入。并继续你的计划。

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

答案 3 :(得分:0)

  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将有助于提高性能。