问题之PreparedStatement executeBatch() 更新仅部分有效
问题之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() 更新仅部分有效相关推荐
- java jdbc 批量更新_java – JDBC PreparedStatement,批量更新和生成的密钥
我在批处理中使用jdbc preparedStatement并尝试获取由此创建的生成密钥时出现问题. 代码 : PreparedStatement stmt = null; ... connectio ...
- mysql executebatch_mysql PreparedStatement executeBatch SQL语句的问题 | 学步园
今天在使用executeBatch时,使用一个很简单的表 CREATE TABLE IF NOT EXISTS `fnbl_dummy` ( `id` varchar(32) NOT NULL, `u ...
- JDBC高级特性(一)结果集,批量更新
一.ResultSet的高级特性 1 可滚动ResultSet 1)向前和向后滚动 滚动特性 在JDBC初期版本号中, ResultSet仅能向前滚动 在JDBC兴许版本号中, ResultSet默认 ...
- php prepare 批量,PreparedStatement批处理
PreparedStatement批量更新关键代码 无 import java.sql.Connection;import java.sql.PreparedStatement; //...Strin ...
- jdbc 批量insert_037 深入JDBC中PreparedStatement对象使用
1. 什么是SQL注入 (1) 什么是SQL注入? 所谓SQL注入,就是通过把含有SQL语句片段的参数插入到需要执行的SQL语句中,最终达到欺骗数据库服务器执行恶意操作的SQL命令. (2) 如何解决 ...
- JDBC批量插入数据优化,使用addBatch和executeBatch
>>.在之前的玩转JDBC打造数据库操作万能工具类JDBCUtil,加入了高效的数据库连接池,利用了参数绑定有效防止SQL注入 中其实忽略了一点,那就是SQL的批量插入的问题,如果来个fo ...
- Java添加多行数据到mysql中_Java:使用PreparedStatement将多行插入到MySQL中
您可以通过PreparedStatement#addBatch()创build一个批处理,并通过PreparedStatement#executeBatch()执行它. 这是一个开球的例子: publ ...
- JDBC批处理插入更新MySQL Oracle
Today we will look into JDBC Batch insert and update examples in MySQL and Oracle databases. Sometim ...
- JDBC:PreparedStatement 插入BLOB类型的数据,PreparedStatement 批量处理,Connection 事务处理
JDBC:PreparedStatement 插入BLOB类型的数据,PreparedStatement 批量处理,Connection 事务处理 每博一文案 村上春树说: 你要做一个不动声色的大人了 ...
最新文章
- 如何让Unity支持中文
- 什么样的人去贷款最受银行欢迎?
- 前端node 和vue开发之环境搭建
- 1064. 朋友数(20)
- Python计算今年第n个周m是几月几号
- Tensorflow API(一)
- Vue+element搭建后台管理系统-二、安装插件
- 服务器系统事件id1001,win10系统玩游戏出现蓝屏事件ID1001的解决方法
- 体育运用计算机教学的教学反思,[转载]体育教师的成长与反思
- Mud Puddles ( bfs )
- yarn.lock、package-lock.json、npm-shrinkwrap.json的理解
- 谷歌服务组件安装简介
- 使用sphinx+reStructuredText制作文档
- vue axios封装以及API统一管理
- OSChina 周五乱弹 ——人类发明眼镜之前眼镜蛇叫什么?
- ubuntu服务器图形界面崩溃解决方案
- 羊车门问题python_用Python实现羊车门问题
- pt-table-checksum使用总结
- 手机qpython3 如何画图_记住这3个功能,一分钟掌握python sns作图
- 超实用的Excel自动排序小技巧,原来这么简单,早点知道就好了!