2012-04-23 89 views
6

我有一个文本文件~6GB,我需要解析并稍后保存。通过'解析'我正在从文件中读取一行(通常为2000个字符),从行中创建一个Car对象,之后我坚持它。我正在使用生产者消费者模式来解析和持久化,并怀疑它是否有任何区别(出于性能原因)在一次提交中一次持续一个对象或1000(或任何其他数量)?现在,我需要花费2个多小时来坚持一切(300万行),而且对我来说看起来太多时间了(或者我可能是错的)。之前,我做任何设计变更我想知道是否有一个原因,这样的设计是更好的(或不),如果是,应该是什么车休眠性能问题,坚持一个一个还是大众?

public void persistCar(Car car) throws Exception 
{ 
    try 
    { 
     carDAO.beginTransaction(); //get hibernate session... 

     //do all save here. 

     carDAO.commitTransaction(); // commit the session 

    }catch(Exception e) 
    { 
     carDAO.rollback(); 
     e.printStackTrace(); 
    } 
    finally 
    { 
     carDAO.close(); 
    } 
} 

目前我在做这个。尺寸()?另外,会议的开/闭会被认为是昂贵的吗?

public void persistCars(List<Car> cars) throws Exception 
{ 
    try 
    { 
     carDAO.beginTransaction(); //get hibernate session... 
     for (Car car : cars)  
     //do all save here. 

     carDAO.commitTransaction(); // commit the session 

    }catch(Exception e) 
    { 
     carDAO.rollback(); 
     e.printStackTrace(); 
    } 
    finally 
    { 
     carDAO.close(); 
    } 
} 

回答

5

传统上,hibernate对于批量插入不能很好地执行。有一些方法可以将其优化到某个级别。

如果插入20个条目,这将使操作快一点后冲洗以本实施例中从API Docs

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 

for (int i=0; i<100000; i++) { 
    Customer customer = new Customer(.....); 
    session.save(customer); 
    if (i % 20 == 0) { //20, same as the JDBC batch size 
     //flush a batch of inserts and release memory: 
     session.flush(); 
     session.clear(); 
    } 
} 

tx.commit(); 
session.close(); 

在上述例子中的会话。这个interesting article讨论相同的东西。

我们已经成功实现了使用存储过程的替代方式的批量插入。在这种情况下,您将参数传递给SP作为“|”分隔列表,并将写入SP内的插入脚本。这里的代码可能看起来有点复杂,但是非常有效。

+0

我会尝试此代码的性能,并回到这个答案。谢谢! – adhg 2012-04-23 23:40:53

+0

配料比较好! – adhg 2012-05-05 20:48:45