因为近期牵涉到有可能大批量更新数据的操作,于是找来Ibatis看了一下其中的批量存储,发现批处理。
代码片段:
- ....
- try{
- this.startBatch();
- for (String str : list<String>) {
- this.update(UP_USER_STATE, str);
- }
- this.executeBatch();
- }catch(Exception es){
- backbool = false;
- throw es;
- }
- .....
startBatch(); //开始一个批处理代码段
this.pdate(UP_USER_STATE, str); //增加更新批处理
executeBatch(); //将之前开始的批处理代码段提交执行
以上代码如转为JDBC操作,可等同于如下代码
- ........
- con.setAutoCommit(false);
- Statement stmt = con.createStatement();
- for (String str : list<String>) {
- stmt.addBatch("update xxx set state=1 where name = '" + str + "'");
- }
- int[] up_count = stmt.executeBatch();
- .....
如果在执行海量数据操作时,应该将更新语句放在一个事务然后分为多次Batch提交,这样对缓存的压力以及更新效率会更高。
executeBatch(); 可以用 endBatch(); 替换,前者是将批处理交给ibatis操作,后者是直接用JDBC驱动进行处理。
另外,Ibatis的批处理对JBDC批处理作了自己的优化,最好在一个Batch块保证只对一个表操作。因为如果对多个表,每次传给Ibatis源代码中关于批处理的 addBatch 方法的 sql实例 都是新的,都会生成一个新的PreparedStatement实例(具体参见
http://www.pcdog.com/edu/java/2006/12/b177829.html ),因此在大批量操作时,会严重影响更新效率。