基于DB2数据库的批量插入
- mybatis单次执行批量插入(10万条)记录报错“该语句过长或过于复杂”:将一次插入改为多次批量插入,在Java代码中分割list。
org.springframework.dao.DataAccessResourceFailureException:
### Error updating database.
Cause: com.ibm.db2.jcc.am.SqlException:
[jcc][t4][10531][14103][4.25.13] 该语句过长或过于复杂。
当前 SQL 语句大小为 3,910,508。 ERRORCODE=-101, SQLSTATE=54001
- 10万条记录多次批量插入报错“DB2数据库的事务日志已满”:加大日志文件大小,增加日志文件个数,增加辅助日志文件个数
DB2数据库的事务日志已满。. SQLCODE=-964, SQLSTATE=57011, DRIVER=3.63.108
参考链接:DB2数据库的事务日志已满。. SQLCODE=-964, SQLSTATE=57011, DRIVER=3.63.108
- 现象:执行的每条SQL参数有20多个,大于1500左右就会报错:参数无效:参数索引超出范围。 ERRORCODE=-4461, SQLSTATE=42815
根本原因是由于mybatis将所有记录合并成一条SQL传入,
超过了DB2的LANGUAGE SQL的过程中的最大参数数:32767
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException:
Could not set parameters for mapping: ParameterMapping{property='__frch_dto_2718.recBank', mode=IN, javaType=class java.lang.String, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}.
Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #24465 with JdbcType OTHER .
Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property.
Cause: com.ibm.db2.jcc.am.SqlSyntaxErrorException: [jcc][10145][10844][4.25.13] 参数 24465 无效:参数索引超出范围。 ERRORCODE=-4461, SQLSTATE=42815
- mybatis进行批量插入并返回主键
<insert id="insertBatch_Card" useGeneratedKeys="true" keyProperty="busiId">
INSERT INTO HD_CARD (cardNo, password, orgNo, status, operDate) VALUES
<foreach collection ="list" item="dto" separator =",">
(#{dto.cardNo}, #{dto.password}, #{dto.orgNo}, #{dto.status}, #{dto.operDate})
</foreach >
</insert>
- mybatis执行的返回值
update、insert、delete返回值默认是int,也可以改为boolean,如果受影响记录数大于0则为true;select中也可以指定返回一条或者多条。 - 当修改后的数据和原数据一致时,mysql可以设置不同的参数来判断是否执行修改操作。