1

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

我正在使用下面的代码进行此操作。我的开发环境是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

4 回答 4

0

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

于 2013-06-13T09:17:29.153 回答
0

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

于 2013-06-13T09:21:36.167 回答
0

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

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

于 2013-06-13T09:21:39.207 回答
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 将有助于提高性能。

于 2013-06-13T09:51:48.310 回答