ibaits 数据库批量更新:批处理和事物

3 篇文章 0 订阅

数据库进行批量更新的时候,如果我们是通过普通的方式进行insert和update的话,执行效率比较低,而且如果涉及到大量的更新操作的时候,每个操作都会开启一个新的事务。而且若果执行过程中出现错误的话,很容易导致脏数据的出现,不易回滚。


为了提高大量数据的更新效率问题,引入了批处理的概念

批处理就是ibatis通过把多个对数据库的操作,让数据库驱动以压缩的方式去批量执行更新命令,不需要每个都分开执行,提高执行的效率。

批处理解决了数据库的效率问题,但是还没有解决回滚和脏数据等问题,因为批处理执行的过程中,每执行一条更新语句,都会进行一次提交,这样子的话,如果其中的部分更新语句执行失败,那么就会产生脏数据的问题。并且,每条语句都提交一次的话,也比较损耗数据库的性能。


为了解决数据的脏数据和进一步提高批量执行的效率,需要引入开启事务来处理这个问题

开启事务的话,数据库的批处理如果有语句出错的话,可以有机会对整个事务进行回滚,不用为脏数据问题担忧。回滚类似于oracle每个客户端的rollback一样的效果。其实我们在事务没有提交之前,更新的是内存中的数据,并不是数据库的磁盘上面的数据。


整体语句可以参考下面的:

public void saveOrder (SqlMapClient sqlMapClient,  Order order) 
throws  SQLException { 
<span style="white-space:pre">	</span><span style="color:#000099;">sqlMapClient. startTransaction();</span>
<span style="white-space:pre">	</span>try { 
<span style="white-space:pre">	</span>if (null == order.getOrderId()) { 
<span style="white-space:pre">		</span>sqlMapClient. insert ("Order. insert",  order); 
<span style="white-space:pre">	</span>}
<span style="white-space: pre;">	</span>else { 
<span style="white-space:pre">		</span>sqlMapClient. update ("Order.update", order); 
<span style="white-space:pre">	</span>} 
<span style="white-space:pre">	</span><span style="color:#ff0000;">sqlMapClient. startBatch() ; </span>
<span style="white-space:pre">	</span>sqlMapClient .delete ("Order .deleteDetails",  order); 
<span style="white-space:pre">	</span>for (int i=O;i<order.getOrderItems() .size();i++){
<span style="white-space:pre">		</span>OrderItem oi =  (OrderItem)  0玄der.getOrderrtems () . get (i) ; 
<span style="white-space:pre">		</span>oi. setOrderld (order .getOrderId () ) ; 
<span style="white-space:pre">		</span>sqlMapClient.insert ("OrderItem. insert",  oi); 
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span><span style="color:#ff0000;">sqlMapClient .executeBatch () ; </span>
<span style="white-space:pre">	</span><span style="background-color: rgb(0, 0, 153);">sqlMapClient .commitTransaction () ; </span>
} finally {
   <span style="color:#000066;">sqlMapClienc. endTransaction () ; </span>
}
}

上面代码中,红色是批处理代码块,蓝色是事务代码块。


注:java代码中,批处理中间的代码块只是用来构造执行的语句,并不会执行,只有最后的executeBatch才会开始执行生成的语句。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值