刚看了hibernate的reference,有些思路了
先把所有的对象都add进一个List,再直接delete这个List对象,这是最佳的方法吗?

解决方案 »

  1.   

    在对性能要求很严格的一些系统中,一些操作(例如批量更新和批量删除)也许直接使
    用JDBC 会更好,但是请先搞清楚这是否是一个瓶颈,并且不要想当然认为JDBC 一定
    会更快。如果确实需要直接使用JDBC,那么最好打开一个Hibernate Session 然后
    从Session 获得connection,按照这种办法你仍然可以使用同样的transaction 策略
    和底层的connection provider。
      

  2.   

    楼上能不能提供一些实质性的建议??谢谢了
    我现在只想知道Hibernate下该如何批量操作
      

  3.   

    刚看了看,如果按我说的,将String[]中的每个元素都add进一个List话,还是有问题,就是如果这个String[]很大时,可能会出现内存溢出,如果用Hibernate下的ScrollableResults进行优化时,做分解操作,是在提取对象进LIST时,还是在做del()方法时呢?
      

  4.   

    实质性的建议就是用jdbc去操作,hb的文档就不建议用hb做批量操作
      

  5.   

    利用对象做批量操作当然会慢的。对象批量操作:
    创建一组对象->调用对象方法->生成多个sql语句->执行sql语句批量操作:
    生成sql语句->执行如果需要从一个表复制到另一个表, 效率还会更低.
      

  6.   

    Exactly~~~~批量操作用JDBC比较好
    但我现在想问的,只是想知道“如何用hibernate完成此操作”
    虽然我肯定大家说的对,但也想自己亲自调一下试试
      

  7.   

    找了些资料
    目前的能想到的hibernate实现是这样:
    将数据批量load上来,再批量砍掉……
    public void remove(String[] id){
        for(){
         //将记录load()进session
       }   for(){
         //将load进来的数据delete()掉……
       }
    }
    一个删除要2个批处理动作....?
      

  8.   

    晕倒,我给的建议还不实际???都告诉你直接用jdbc了你还不明白???
      

  9.   

    session.connection().createStatement().executeUpdate(sql);
      

  10.   

    抱歉,因为我表达能力不太好,让你误会了
    不是不实际……
    确实我也看到了,用JDBC的好…………
    但我这不只是想知道hibernate的实现方法吗......
      

  11.   

    而且你说的:session.connection().createStatement().executeUpdate(sql);
    只是一个普通的更新操作,不是批处理操作啊
    JDBC做批处理
    应该这样吧
    session.connection().PreparedStatement(SQL).addBatch(String sql)
    executeBatch()
    而hibernate里,我看到sf.hibernate.engine下有一个Batcher接口
    提供了
    public void addToBatch(int expectedRowCount)
    throws SQLException,HibernateException
    和public void executeBatch()throws HibernateException但hibernate中的update/insert/delete操作都是针对session的,例如一个删除操作如下:
    User user = (User)session.load(User.class,id);
    session.delete(user);所以我现在只能把一个批量删除操作分为2步来做,很难受,不知道hibernate有没有其他的方法来实现??
      

  12.   

    看了你的帖子后做了个简单的测试,hibernate好象会自己处理大量的SQL操作
    long l1 = System.currentTimeMillis();
    String abc = request.getParameter("number");
    int all = Integer.parseInt(abc);
    Product pro = new Product();
    for(int i=0;i<all;i++){
    pro.setProductName("testjdbc");
    new ProductManager().addProduct(pro);//这里换成hibernate的插入再测
    }
    out.println("添加记录的条数为"+all+"<br>"+"所用时间为:");
    out.println(System.currentTimeMillis()-l1);两次的结果相差很多,平均是1:5,当然JDBC的插入没有用批处理executeBatch(),最近没时间,等有时间再把优化后JDBC的结果测出来,总之你就先save(),delete()吧,其他的都交给Hibernate了,设置一下hibernate.cfg.xml的jdbc.fetch_size和jdbc.batch_size参数就可以了
      

  13.   

    直接写hql吧,用where  .. in(...,...,...)试试,
    或in(list/colection)