Java hibernate性能问题,一个一个持续还是批量?
我有一个6GB的文本文件,我需要解析它,然后保存。通过“解析”,我从文件中读取一行(通常为2000个字符),从该行创建一个Car对象,然后我将其持久化 我正在使用生产者-消费者模式来解析和持久化,我想知道(出于性能原因)一次持久化一个对象或一次提交1000个(或任何其他数量)是否会有什么不同 目前,我花了超过2小时的时间来保存所有内容(300万行),而且对我来说时间太长了(或者我可能错了) 目前我正在这样做:Java hibernate性能问题,一个一个持续还是批量?,java,database,hibernate,persistence,Java,Database,Hibernate,Persistence,我有一个6GB的文本文件,我需要解析它,然后保存。通过“解析”,我从文件中读取一行(通常为2000个字符),从该行创建一个Car对象,然后我将其持久化 我正在使用生产者-消费者模式来解析和持久化,我想知道(出于性能原因)一次持久化一个对象或一次提交1000个(或任何其他数量)是否会有什么不同 目前,我花了超过2小时的时间来保存所有内容(300万行),而且对我来说时间太长了(或者我可能错了) 目前我正在这样做: public void persistCar(Car car) throws Exce
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();
}
}
在我进行任何设计更改之前,我想知道这种设计更好(或不更好)是否有原因,如果是这样,应该是什么样的车。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();
}
}
公共车辆(列出车辆)引发异常
{
尝试
{
carDAO.beginTransaction();//获取休眠会话。。。
用于(汽车:汽车)
//所有的都保存在这里。
carDAO.commitTransaction();//提交会话
}捕获(例外e)
{
carDAO.rollback();
e、 printStackTrace();
}
最后
{
carDAO.close();
}
}
传统上,hibernate不适合大容量插入。有一些方法可以在一定程度上优化它
就拿这个例子来说,
Session Session=sessionFactory.openSession();
事务tx=会话.beginTransaction();
对于(int i=0;我将尝试此代码的性能,然后返回此答案。谢谢!
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();