jdbc中的批处理是用addBatch,这样最终的sql语句应该是insert into table values ('a1','b1'),('a2','b2')这么一句sql吧。
而hibernate的批处理是每N个后flush下,这样主要是防止实体对象占用太多内存,我的疑问是这样实际是执行多个sql还是如jdbc一样?
回复“自己试试看不就知道”的就不用回复了。我只想听明确的回答。
而hibernate的批处理是每N个后flush下,这样主要是防止实体对象占用太多内存,我的疑问是这样实际是执行多个sql还是如jdbc一样?
回复“自己试试看不就知道”的就不用回复了。我只想听明确的回答。
什么叫批处理,当然是把一批SQL一起提交...
话说,这种问题 -> "回复“自己试试看不就知道”的就不用回复了。我只想听明确的回答。"
的确是自己试试看就知道了,连打印个sql语句都懒的做吗?
但是jdbc如果像你说的不是生成这种语句,感觉和一条条提交没区别啊。批处理提交最终的commit语句还是要到所有处理结束时才真的commit吧。
而且,并不是说你commit了才把数据提交给数据库的,这个主要看数据驱动的实现
以sqlserver来说
打开一个connection时,数据连接已经建立,然后启动事务处理
之后提交的每个batch语句,已经从client转交到数据库,由数据库负责虚处理
当你所有的batch语句都完成以后,调用commit告诉数据库,之前传送的所有语句可以被真正执行
假设传送的是rollback语句,那之前的虚处理将被放弃,数据回滚,不会改动实际数据其实就是事务处理的一个流程,批处理和单处理没有本质上的区别
只有预编译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对于数据库来说并不会有多大的压力