在使用jdbctemplate的批量操作的时候调用jdbcTemplate.batchUpdate,他的原理机制是,集合一定数量的sql,一起发送到数据库,这样减少与数据库频繁交互的成本但现在有一个问题就是,我这有50条sql,批量插入,然后有一条有问题,我如何让这一条执行失败时,不影响其余49条语句的执行呢?下面是我自己封装的一个方法批量插入这个list到数据库去,如果出现什么值太大,违反唯一性约束什么之类的异常,我的那个catch根本就捕获不住,我最多只能知道这个list插入有问题,没法实现list中一条记录有问题,不影响其他记录的执行public void insert(final List<?> lists) {// 获取insert语句 eg:sql = insert into user (id,name,age) values (?,?,?)String sql = SqlUtils.getInsertSql(lists.get(0));jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {@Overridepublic void setValues(PreparedStatement ps, int i) {Object value = lists.get(i);// objects = 获取代替?的具体值Object[] objects = SqlUtils.getValues(value);for (int k = 0; k < objects.length; k++) {try {ps.setObject(k + 1, objects[k]);} catch (SQLException e) {log.error("数据库异常 -- "+value.getClass().getSimpleName(),e);}}} @Override
public int getBatchSize() {
return lists.size();
}
});}
3 回答
弑天下
TA贡献1818条经验 获得超8个赞
如果想批量,就要一起commit,一起回滚事物,
否则如果你想记录记录哪条数据有问题,
那就不要批量,一条一条提交,
碰到有问题的trycatch去捕获他,
定义一个字符串记录一下,然后再继续提交,
如果再次碰到有问题的,然后在追加字符串,
最终返回字符串,
如果是空的,代表全部成功,
否则就查询字符串里面记录的信息,就知道哪条失败了
呼如林
TA贡献1798条经验 获得超3个赞
批量么,肯定是要么全commit,要么全rollback。
你既然用了batchUpdate,batchInsert,那你肯定得确保你的批量sql都没有问题。
神马主键约束啊,你设计的数据库不会考虑到这些问题么,如果不用主键自增长,那你页面表单就得ajax判断数据库是不是已经存在了!
长度神马的都是客户端上该处理的问题,你这些验证控制自己不做好,数据库再牛板也帮不了你啊
添加回答
举报
0/150
提交
取消