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)
传统上,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.这里的代码可能看起来有点复杂但非常有效.
归档时间: |
|
查看次数: |
2269 次 |
最近记录: |