在网络有一篇关于iBATIS batch原理的牛贴: http://www.javaeye.com/topic/68962 分析的也是iBATIS下的批处理。在iBATIS1.3的源代码中没没有见到这篇帖子标识的 代码,而且在1.3中,iBATIS处理batch的思路和这篇帖子也不相同。
iBATIS的批处理就是jdbc中的ps的batch操作。
在 iBATIS 1.x 中,批处理是为了对于同一个 sql ,使用 PreparedStatement 完成重复操作,使用了 ps 的批处理功能。 在一次 batch 中,iBATIS 会把用到的所有 ps 实例放到一个 ThreadLocal 对象中,根据 MappedStatement 来获取相应的 ps 做数据库更新操作,这样就避免了batch 过程中的多表操作生成 ps 时的效率问题。
iBATIS生成ps代码:
getStatementFromBatch
流程如下:
注:
count:当前处理的数据量
size: 批处理的数量
开启事务事务之后,然后进行批次处理。在这种情况下,整个批处理都是在同一个connection下完成的。在运行commitTransaction后,所有的数据才会提交的数据库中。
如果未开启事务,那么每次开启一个batch,在运行executeUpdate语句的时候都要获取一个新的connection,导致效率下降。此时,每次sqlMap.endBatch(),都会将当前 size的数据插入到数据库中。