我正在尝试使用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()
操作的性能有任何想法吗?
感谢。
答案 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将有助于提高性能。