yuersmile
yuersmile
2009-03-02 17:36

关于hibernate的一个批量操作

已采纳

我在做项目遇到一个很经典的问题,就是用hibernate做批量插入的问题。

方法1:
读取一行数据,dao保存一行数据,所有的保存放在一个事务;
方法2:读取所有的数据,拼接成一个hql,一次性执行;

请问那个效率会好一点?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • iteye_13779 iteye_13779 12年前

    这话题在Hibernate帮助文档里就有说明呀!如下:
    13.1. 批量插入(Batch inserts)
    如果要将很多对象持久化,你必须通过经常的调用 flush() 以及稍后调用 clear() 来控制第一级缓存的大小。

    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 //20,与JDBC批量设置相同
    //flush a batch of inserts and release memory:
    //将本批插入的对象立即写入数据库并释放内存
    session.flush();
    session.clear();
    }
    }

    tx.commit();
    session.close();
    13.2. 批量更新(Batch updates)
    此方法同样适用于检索和更新数据。此外,在进行会返回很多行数据的查询时, 你需要使用 scroll() 方法以便充分利用服务器端游标所带来的好处。

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

    ScrollableResults customers = session.getNamedQuery("GetCustomers")
    .setCacheMode(CacheMode.IGNORE)
    .scroll(ScrollMode.FORWARD_ONLY);
    int count=0;
    while ( customers.next() ) {
    Customer customer = (Customer) customers.get(0);
    customer.updateStuff(...);
    if ( ++count % 20 == 0 ) {
    //flush a batch of updates and release memory:
    session.flush();
    session.clear();
    }
    }

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

    点赞 评论 复制链接分享
  • sl514 sl514 12年前

    楼上的回答的很好

    点赞 评论 复制链接分享

相关推荐