yuersmile 2009-03-02 17:36
浏览 344
已采纳

关于hibernate的一个批量操作

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

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

请问那个效率会好一点?

  • 写回答

2条回答 默认 最新

  • iteye_13779 2009-03-02 18:26
    关注

    这话题在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();

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable