hibernate性能问题,一个接一个地持续存在还是质量?

adh*_*dhg 6 java database persistence hibernate

我有一个~6GB的文本文件,我需要解析并稍后保留.通过'解析'我正在从文件中读取一行(通常是2000个字符),从该行创建一个Car-object,然后我坚持下去.

我正在使用生产者消费者模式进行解析和持久化,并想知道它是否会在一次提交中一次持有一个对象或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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在我进行任何设计更改之前,我想知道这个设计是否更好(或不是)的原因是什么,如果是,那么cars.size()应该是什么?会议的开放/结束是否被认为是昂贵的?

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Man*_*uPK 5

传统上,hibernate在批量插入方面表现不佳.有一些方法可以将它优化到某种程度.

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();
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,如果在插入20个条目后刷新会话将使操作稍微快一些.

这是一篇讨论同样内容的有趣文章.

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