2012-01-19 50 views
3

我想用Hibernate在数据库中保存多条记录,但我认为我的方法是错误的。因为如果记录增加,它会创建性能问题。用Hibernate在数据库中保存多条记录

我想在数据库存储一样,

FirstName   LastName 
FNameABC   LNameCC   
FNamePQR   LNameDD   
FNameXYZ   LNameEE 

我存储在数据库上面的值,

Iterator itr = list.Iterator(); 
while(itr.hasNext()) { 
    Test t = (Test)itr.next(); 
    dbEntity.setFirstName(t.setFirstName()); 
    dbEntity.setLastName(t.setLastName()); 
    session.beginTransaction(); 
    session.save(dbEntity); 
    session.getTransaction().commit(); 
    session.close(); 
} 

在这里我保存在一个循环内seession值。所以每次记录都会调用beginTransaction(),save(),commit()。 有没有更好的方法?

+0

你确定每个插入都应该在单独的事务中完成吗? –

回答

3

请看看这个页面:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html

您应该打开一个交易,保存(在环)的实体,在最后提交事务并关闭会话。 建议您可以在循环时使用计数器,并在达到特定数量后进行闪烁/清理会话 - 定期进行。

+0

在大量实体中使用此方法时,需要定期刷新和清除会话。肮脏检查大量实体很快成为瓶颈。 –

+0

取决于案件,实体数量,公开会话的数量......如果案件不会发生,有时不值得实施复杂的解决方案。我的回答只是针对特定的情况。我同意在极端情况下应考虑不同的方法。 –

+0

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html –

2

根据技术或性能考虑,您不会选择启动和提交事务。您选择基于您认为应该原子,连贯地完成并与其他交易分开进行。阅读http://en.wikipedia.org/wiki/ACID

如果你想确保所有的插入成功或失败,但你不应该处于一半成功而另一半失败的状态,那么你的事务应该封装所有的插入:你启动在第一个之前交易,并在最后一个之后提交。

相反,如果您希望每个插入操作在其自己的事务中完成,例如,如果一个失败但能够coninue插入其他事务时能够捕获异常,那么每个插入应该在其自己的事务中完成,就像你在做什么一样。

相关问题