jdbc中的批处理是用addBatch,这样最终的sql语句应该是insert into table values ('a1','b1'),('a2','b2')这么一句sql吧。
而hibernate的批处理是每N个后flush下,这样主要是防止实体对象占用太多内存,我的疑问是这样实际是执行多个sql还是如jdbc一样?
回复“自己试试看不就知道”的就不用回复了。我只想听明确的回答。

解决方案 »

  1.   

    谁告诉你jdbc会给你生成这么个SQL的...
    什么叫批处理,当然是把一批SQL一起提交...
    话说,这种问题 -> "回复“自己试试看不就知道”的就不用回复了。我只想听明确的回答。"
    的确是自己试试看就知道了,连打印个sql语句都懒的做吗?
      

  2.   

    hibernate的需要批处理主要是由于session级会缓存对象,所以会造成内存泄露,所以必须批处理一部分一部分提交。
    但是jdbc如果像你说的不是生成这种语句,感觉和一条条提交没区别啊。批处理提交最终的commit语句还是要到所有处理结束时才真的commit吧。
      

  3.   

    当然和一条条提交不一样...
    而且,并不是说你commit了才把数据提交给数据库的,这个主要看数据驱动的实现
    以sqlserver来说
    打开一个connection时,数据连接已经建立,然后启动事务处理
    之后提交的每个batch语句,已经从client转交到数据库,由数据库负责虚处理
    当你所有的batch语句都完成以后,调用commit告诉数据库,之前传送的所有语句可以被真正执行
    假设传送的是rollback语句,那之前的虚处理将被放弃,数据回滚,不会改动实际数据其实就是事务处理的一个流程,批处理和单处理没有本质上的区别
      

  4.   

    当然不是commit数据才传到服务器的,commit是指提交事务,当然此前数据库肯定已经在数据库了(脏读什么就跟这有关)。我觉得批处理还是影响请求的条数。比如10条插入命令,用批处理只要发送一条请求。
      

  5.   

    好吧,batch我错了但是,以PreparedStatement来说,也并不是传递sql的
    只有预编译SQL是在编译阶段传递的,其他batch仅仅传递"值"而已
     测试语句:PreparedStatement ps = conn.prepareStatement("insert into test values(?)");
    for(int i = 0; i < 10 ; ++i) {
    ps.setInt(1, i);
    ps.addBatch();

    System.out.println("batch");
    Thread.sleep(1000);
    }
    ps.executeBatch();
    conn.commit(); SQLSERVER的数据跟踪结果
    只有预编译语句是被传递的,后面的都是值传递
    最后commit时,采用COMMIT TRAN所以,batch对于数据库来说并不会有多大的压力
      

  6.   

    batch和是否是PreparedStatment没有什么关系,Statement也是可以addBatch的,区别就在于预编译,当然,预编译是数据库服务器端做的,如果使用Statement进行批处理,每条语句还会先编译、