在hibernate中插入大量记录的最佳方法

时间:2011-01-03 19:30:52

标签: java hibernate batch-processing

我正在使用hibernate + play!工作中的框架,是否有使用hibernate插入大量记录的“最佳实践”?它们每个文本文件大约有6,000到10,000个,因此我不知道Hibernate是否会在工作中窒息或抛出异常。

任何建议让我知道,如果我需要解释更多,请告诉我

5 个答案:

答案 0 :(得分:24)

来自* Java Persistence and Hibernate“(Manning)并遵循Pangea的评论,使用无状态会话(没有持久性上下文缓存):

StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
    Item item = new Item(...);
    session.insert(item);
}
tx.commit();
session.close();

答案 1 :(得分:2)

对Kartoch答案中的代码进行了一些更正。

根据Batch Procession,&#34; StatelessSession接口定义的insert(),update()和delete()操作被认为是直接数据库行级操作。它们分别导致立即执行SQL INSERT,UPDATE或DELETE。它们与Session接口定义的save(),saveOrUpdate()和delete()操作具有不同的语义。&#34;

StatelessSession不再有save(),flush(),clear()。代码应该是这样的:

StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
  Item item = new Item(.....);
  session.insert(item );
}    

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

最后,这里讨论正常批量插入和StatelessSession插入之间的区别:Using StatelessSession for Batch processing

答案 2 :(得分:1)

只需打开您的会话和交易。

添加会话保存中的所有元素。

然后提交交易。

//Remember to effective handler errors
public void saveAll(List<Object> list) throws Exception{
Session s = HibernateUtil.openSession();
Transaction tx = s.beginTransaction();
for(Object obj : list)
 s.save(obj);
tx.commit();
s.flush();
s.close();
}

答案 3 :(得分:1)

最好是使用StatelessSessions。请考虑以下(http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/batch.html)的示例:

StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();

ScrollableResults customers = session.getNamedQuery("GetCustomers")
    .scroll(ScrollMode.FORWARD_ONLY);
while ( customers.next() ) {
    Customer customer = (Customer) customers.get(0);
    customer.updateStuff(...);
    session.update(customer);
}

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

答案 4 :(得分:-5)

如果要在休眠之外进行插入,可以直接获取Connection对象。

Connection connection = DB.getConnection();