f156465465 2014-05-30 10:01
浏览 1686
已采纳

【jdbcTemplate】批量插入异常捕获

在使用jdbctemplate的批量操作的时候

调用jdbcTemplate.batchUpdate,他的原理机制是,集合一定数量的sql,一起发送到数据库,这样减少与数据库频繁交互的成本
但现在有一个问题就是,我这有50条sql,批量插入,然后有一条有问题,我如何让这一条执行失败时,不影响其余49条语句的执行呢?

下面是我自己封装的一个方法
批量插入这个list到数据库去,如果出现什么值太大,违反唯一性约束什么之类的异常,我的那个catch根本就捕获不住,我最多只能知道这个list插入有问题,没法实现list中一条记录有问题,不影响其他记录的执行

[code="java"]
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() {
@Override
public 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();
    }
});

}
[/code]

  • 写回答

3条回答 默认 最新

  • 黄菲 2014-05-30 11:09
    关注

    如果想批量,就要一起commit,一起回滚事物,
    否则如果你想记录记录哪条数据有问题,
    那就不要批量,一条一条提交,
    碰到有问题的trycatch去捕获他,
    定义一个字符串记录一下,然后再继续提交,
    如果再次碰到有问题的,然后在追加字符串,
    最终返回字符串,
    如果是空的,代表全部成功,
    否则就查询字符串里面记录的信息,就知道哪条失败了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用