【jdbcTemplate】批量插入异常捕获

问题描述

在使用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);}}}@Overridepublic int getBatchSize() {return lists.size();}});}

解决方案

如果想批量,就要一起commit,一起回滚事物,否则如果你想记录记录哪条数据有问题,那就不要批量,一条一条提交,碰到有问题的trycatch去捕获他,定义一个字符串记录一下,然后再继续提交,如果再次碰到有问题的,然后在追加字符串,最终返回字符串,如果是空的,代表全部成功,否则就查询字符串里面记录的信息,就知道哪条失败了
解决方案二:
批量么,肯定是要么全commit,要么全rollback。你既然用了batchUpdate,batchInsert,那你肯定得确保你的批量sql都没有问题。神马主键约束啊,你设计的数据库不会考虑到这些问题么,如果不用主键自增长,那你页面表单就得ajax判断数据库是不是已经存在了!长度神马的都是客户端上该处理的问题,你这些验证控制自己不做好,数据库再牛板也帮不了你啊
解决方案三:
做不到,JDBC batch 操作是批量提交的

时间: 2024-12-24 21:01:11

【jdbcTemplate】批量插入异常捕获的相关文章

Spring源码分析——JdbcTemplate执行批量insert操作

最近用到一个方法: @Override public int[] batchUpdate(String sql, final BatchPreparedStatementSetter pss) throws DataAccessException { if (logger.isDebugEnabled()) { logger.debug("Executing SQL batch update [" + sql + "]"); } return execute(sql

执行批处理batchUpdate时出错,怎样定位执行到哪一条数据出错?

问题描述 使用spring的JdbcTemplate批量插入数据时出错,我想找出具体是哪条数据有问题,把这条数据打印到控制台,代码怎样编写?现在的代码如下:StringBuffersql=newStringBuffer();sql.append("insertintoYGTB(SEQNO,PSCD,NAME,GZ)");sql.append("values(?,?,?,?)");try{getJdbcTemplate().batchUpdate(sql.toStri

JS高级调试技巧:捕获和分析 JavaScript Error详解

前端工程师都知道 JavaScript 有基本的异常处理能力.我们可以 throw new Error(),浏览器也会在我们调用 API 出错时抛出异常.但估计绝大多数前端工程师都没考虑过收集这些异常信息 反正只要 JavaScript 出错后刷新不复现,那用户就可以通过刷新解决问题,浏览器不会崩溃,当没有发生过好了.这种假设在 Single Page App 流行之前还是成立的.现在的 Single Page App 运行一段时间后状态复杂无比,用户可能进行了若干输入操作才来到这里的,说刷新就

捕获和分析JavaScript Error的方法

 这篇文章主要介绍了如何捕获和分析 JavaScript Error,感兴趣的朋友可以参考下 如何捕获和分析 JavaScript Error    前端工程师都知道 JavaScript 有基本的异常处理能力.我们可以 throw new Error(),浏览器也会在我们调用 API 出错时抛出异常.但估计绝大多数前端工程师都没考虑过收集这些异常信息.反正只要 JavaScript 出错后刷新不复现,那用户就可以通过刷新解决问题,浏览器不会崩溃,当没有发生过好了.这种假设在 Single Pa

JS高级调试技巧:捕获和分析 JavaScript Error详解_javascript技巧

反正只要 JavaScript 出错后刷新不复现,那用户就可以通过刷新解决问题,浏览器不会崩溃,当没有发生过好了.这种假设在 Single Page App 流行之前还是成立的.现在的 Single Page App 运行一段时间后状态复杂无比,用户可能进行了若干输入操作才来到这里的,说刷新就刷新啊?之前的操作岂不要完全重做?所以我们还是有必要捕获和分析这些异常信息的,然后我们就可以修改代码避免影响用户体验. 捕获异常的方式 我们自己写的 throw new Error() 想要捕获当然可以捕获

捕获和分析JavaScript Error的方法_javascript技巧

如何捕获和分析 JavaScript Error 前端工程师都知道 JavaScript 有基本的异常处理能力.我们可以 throw new Error(),浏览器也会在我们调用 API 出错时抛出异常.但估计绝大多数前端工程师都没考虑过收集这些异常信息.反正只要 JavaScript 出错后刷新不复现,那用户就可以通过刷新解决问题,浏览器不会崩溃,当没有发生过好了.这种假设在 Single Page App 流行之前还是成立的.现在的 Single Page App 运行一段时间后状态复杂无比

java-开了事务以后,插入大量数据还有必要用批量插入吗?

问题描述 开了事务以后,插入大量数据还有必要用批量插入吗? 我用的是jdbcTemplate,但是我用了事务,我还有必要用批量更新方法吗? 事务不就是等所有插入语句执行完了再执行提交的吗?这个是不是就相当于是批量插入了呢 解决方案 我觉得这个两个概念批量插入解少的是客户端到数据库服务器的交互次数.并且如果不是静态SQL方式的,减少编译次数.事务是保证数据的一致性. 解决方案二: 事务时为了保证数据一致性用的Begintrans() //开始事务for(i=0;i<count;i++){Sql =

一句代码实现批量数据绑定[下篇]

<上篇>主要介绍如何通过DataBinder实现批量的数据绑定,以及如何解决常见的数据绑定问题,比如数据的格式化.接下来,我们主要来谈谈DataBinder的设计,看看它是如何做到将作为数据源实体的属性值绑定到界面对应的控件上的.此外,需要特别说明一点:<上篇>中提供了DataBinder最初版本的下载,但已经和本篇文章介绍的已经大不一样了.最新版本的主要解决两个主要问题:通过Expression Tree的方式进行属性操作(属性赋值和取值),添加了"数据捕捉"

《HBase权威指南》一3.3 批量处理操作

3.3 批量处理操作 现在我们已经介绍过添加.检索和删除表中数据的操作了,不过前面介绍的操作都是基于单个实例或基于列表的操作.这一节将会介绍一些API调用,这些调用可以批量处理跨多行的不同操作. 文字事实上,许多基于列表的操作,如delete(List deletes)或者get(List gets),都是基于batch()方法实现的.它们都是一些为了方便用户使用而保留的方法.如果你是新手,推荐使用batch()方法进行所有操作. 下面的客户端API方法提供了批量处理操作.用户可能注意到这里引入