JDBC PreparedStatement executeBatch 如何忽略异常?

kneee 2014-02-26 10:18:54
JDBC的批量执行SQL方法,数据库是ORACLE,现在的问题是
比如我有20条数据要插入,当中有1条出异常了,
比如主键冲突,剩下的19条全都插入不进去,(其实是能执行到具体报错的那条,后面都给忽略了)
求大神来说说,有没有简单的解决方法,
忽略那1条的错误,让剩下的19条数据正常入库呢?
如果1条条数据插入,自己手动忽略每条的异常,
是可以避免这个问题,就是效率上差距太大了(1分钟和1小时那么大)
如何能两全齐美呢。
...全文
686 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kneee 2014-02-27
  • 打赏
  • 举报
回复
谢谢楼上了,看来我只能退而求其次了,现在想到的办法是先验证下住键这个方法不知道好不好
MiceRice 2014-02-26
  • 打赏
  • 举报
回复
没有直接的办法,因为数据库很严谨。事务的原则就是要么全成功要么全失败。如果让其中19条插入成功了,那么很难让你知道是哪1条失败了。 变相方案: 1、先用executeBatch把所有数据插入另一张临时表(空表); 2、用一句Select Insert实现过滤掉临时表中存在于目标表重复主键的记录并插入目标表。 另外如果是Oracle的话,也可以用Merge语句: merge into 目标表 using 源表 | (select 语句) on ( 条件 ) when matched then update set 列=值 delete where ( 列=值 ) when not matched then insert ( 列... ) values ( 值... );
MiceRice 2014-02-26
  • 打赏
  • 举报
回复
看样子这个接口比较麻烦,即便是Oralce,不同版本的驱动行为也不同。 看看这篇文章对你有没有帮助: http://www.blogjava.net/toby/archive/2010/09/10/331637.html
MiceRice 2014-02-26
  • 打赏
  • 举报
回复
记得executeBatch之内是一个事务,而 之间则不是一个事务。 后面翻查了下资料,看来executeBatch内部如何执行也不一定,有些JDBC驱动是250一组提交,也就是如果超过250个Insert,它就先提交了,那么这250个要么都成功要么都失败。如果你是第300个出错,那么就变成前面250个插入成功,而251~300则插入失败。 另外,API的说明有解释关于是否继续执行的: If one of the commands in a batch update fails to execute properly, this method throws a BatchUpdateException, and a JDBC driver may or may not continue to process the remaining commands in the batch. However, the driver's behavior must be consistent with a particular DBMS, either always continuing to process commands or never continuing to process commands. 这里面说,JDBC驱动可能会继续执行,也可能不会,仍然是跟数据库有关。
kneee 2014-02-26
  • 打赏
  • 举报
回复
我自己测试过啊executeBatch其实不是个事务啊,还是能插进去几条的, 而且关键executeBatch源代码上的说明,返回值里是区分成功和失败的, 失败据说可以继续执行,可惜异常它就直接跳回来了,让我觉得非常不理解 难道异常难道不属于它说明上的失败吗,唉。

25,985

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧