问题之PreparedStatement executeBatch() 更新仅部分有效

问题背景

某业务场景下,需要批量对订单信息进行更新,分成功和失败,更新不同的字段。涉及两张表,订单表和订单扩展表,一共四条不同的SQL。 一开始想的是,PreparedStatement也支持不同SQL的批量处理,直接遍历orderList集合,将所有要更新的sql都通过addbatch()添加进行,然后每100条执行一次。
注:两个表是分库分表的【shardingJDBC】

问题

代码成功运行,没报错,也打印出了执行SQL,数量和数据都对上了。但是查看数据库,真正更新了的,只有最后2个SQL。
测试中,集合有10个order,全部走【OrderConstant.OrderStatus.FAIL != orderPO.getOrderStatus()】分支。百度也没有找到原因,感觉应该是可以成功的才对。

解决办法:

分拆SQL,遍历4次list,分成4个SQL批次执行

代码如下:

private void batchUpdateOrder(List<OrderPO> orderList){log.info("批量更新订单信息--->准备批量更新订单信息");Connection connection = null;PreparedStatement psOrder = null;try {SqlSessionFactory sqlSessionFactory = ApplicationContextUtil.getBean(SqlSessionFactory.class);connection = sqlSessionFactory.openSession().getConnection();connection.setAutoCommit(false);//  根据状态来判断校验失败还是成功,进而选择SQL进行执行int sqlNum = 0;for (OrderPO orderPO : orderList){if (OrderConstant.OrderStatus.FAIL != orderPO.getOrderStatus()) {psOrder = connection.prepareStatement(SQL_SUCCESS_ORDER_EXT);psOrder.setString(1, orderPO.getExt3());/*...*/psOrder.addBatch();psOrder = connection.prepareStatement(SQL_SUCCESS_ORDER);psOrder.setBigDecimal(1, orderPO.getSubBatchNo());/*...*/psOrder.addBatch();} else {psOrder = connection.prepareStatement(SQL_FAIL_ORDER_EXT);psOrder.setString(1, orderPO.getChannelErrorCode());/*...*/psOrder.addBatch();psOrder = connection.prepareStatement(SQL_FAIL_ORDER);psOrder.setInt(1, orderPO.getOrderStatus());/*...*/psOrder.addBatch();}sqlNum = sqlNum + 2;if(sqlNum % 100 == 0){psOrder.executeBatch();log.info("批量更新订单信息--->已更新 {} 笔订单数据",  sqlNum/2);}}psOrder.executeBatch();log.info("批量更新订单信息--->批量更新订单信息全部更新完毕,共更新 {} 笔",  sqlNum/2);connection.commit();connection.setAutoCommit(true);} catch (Exception ex) {log.error("批量更新订单信息--->,批量更新订单信息数据出现异常",  ex);throw new BizException(ErrorCodeEnum.BATCH_UPDATE_ORDER_EXT_FAIL);} finally {if (psOrder != null) {try {psOrder.close();} catch (Exception ex) {log.error("psOrder close error.", ex);}}if (connection != null) {try {connection.close();} catch (Exception ex) {log.error("connection close error.", ex);}}}}

问题之PreparedStatement executeBatch() 更新仅部分有效相关推荐

  1. java jdbc 批量更新_java – JDBC PreparedStatement,批量更新和生成的密钥

    我在批处理中使用jdbc preparedStatement并尝试获取由此创建的生成密钥时出现问题. 代码 : PreparedStatement stmt = null; ... connectio ...

  2. mysql executebatch_mysql PreparedStatement executeBatch SQL语句的问题 | 学步园

    今天在使用executeBatch时,使用一个很简单的表 CREATE TABLE IF NOT EXISTS `fnbl_dummy` ( `id` varchar(32) NOT NULL, `u ...

  3. JDBC高级特性(一)结果集,批量更新

    一.ResultSet的高级特性 1 可滚动ResultSet 1)向前和向后滚动 滚动特性 在JDBC初期版本号中, ResultSet仅能向前滚动 在JDBC兴许版本号中, ResultSet默认 ...

  4. php prepare 批量,PreparedStatement批处理

    PreparedStatement批量更新关键代码 无 import java.sql.Connection;import java.sql.PreparedStatement; //...Strin ...

  5. jdbc 批量insert_037 深入JDBC中PreparedStatement对象使用

    1. 什么是SQL注入 (1) 什么是SQL注入? 所谓SQL注入,就是通过把含有SQL语句片段的参数插入到需要执行的SQL语句中,最终达到欺骗数据库服务器执行恶意操作的SQL命令. (2) 如何解决 ...

  6. JDBC批量插入数据优化,使用addBatch和executeBatch

    >>.在之前的玩转JDBC打造数据库操作万能工具类JDBCUtil,加入了高效的数据库连接池,利用了参数绑定有效防止SQL注入 中其实忽略了一点,那就是SQL的批量插入的问题,如果来个fo ...

  7. Java添加多行数据到mysql中_Java:使用PreparedStatement将多行插入到MySQL中

    您可以通过PreparedStatement#addBatch()创build一个批处理,并通过PreparedStatement#executeBatch()执行它. 这是一个开球的例子: publ ...

  8. JDBC批处理插入更新MySQL Oracle

    Today we will look into JDBC Batch insert and update examples in MySQL and Oracle databases. Sometim ...

  9. JDBC:PreparedStatement 插入BLOB类型的数据,PreparedStatement 批量处理,Connection 事务处理

    JDBC:PreparedStatement 插入BLOB类型的数据,PreparedStatement 批量处理,Connection 事务处理 每博一文案 村上春树说: 你要做一个不动声色的大人了 ...

最新文章

  1. 如何让Unity支持中文
  2. 什么样的人去贷款最受银行欢迎?
  3. 前端node 和vue开发之环境搭建
  4. 1064. 朋友数(20)
  5. Python计算今年第n个周m是几月几号
  6. Tensorflow API(一)
  7. Vue+element搭建后台管理系统-二、安装插件
  8. 服务器系统事件id1001,win10系统玩游戏出现蓝屏事件ID1001的解决方法
  9. 体育运用计算机教学的教学反思,[转载]体育教师的成长与反思
  10. Mud Puddles ( bfs )
  11. yarn.lock、package-lock.json、npm-shrinkwrap.json的理解
  12. 谷歌服务组件安装简介
  13. 使用sphinx+reStructuredText制作文档
  14. vue axios封装以及API统一管理
  15. OSChina 周五乱弹 ——人类发明眼镜之前眼镜蛇叫什么?
  16. ubuntu服务器图形界面崩溃解决方案
  17. 羊车门问题python_用Python实现羊车门问题
  18. pt-table-checksum使用总结
  19. 手机qpython3 如何画图_记住这3个功能,一分钟掌握python sns作图
  20. 超实用的Excel自动排序小技巧,原来这么简单,早点知道就好了!

热门文章

  1. 什么蓝牙耳机打电话效果最好?通话效果好的无线蓝牙耳机
  2. 孩子被欺负了,父母该如何做才是上策
  3. 计算机毕业设计(附源码)python智慧校园系统
  4. 现在的我也是曾经的我
  5. 微信小程序-----滚动字幕
  6. 给suse系统添加源
  7. 连杆结构的优化matlab,MATLAB连杆优化
  8. IsBackground对线程的重要作用
  9. m基于matlab的WLAN室内无线信道建模与仿真
  10. java计算机毕业设计五金机电市场批发零售管理信息系统源码+数据库+系统+lw文档+mybatis+运行部署