我想把oracle中的数据全部导进其他的数据库,现在由于数据量过大,所以我选择了批处理,但是如果有一条数据报错,那么全部数据都不能执行成功,而且commit后直接
报错了循环也中断了,请问我该怎么处理
本人菜鸟,求各位大佬帮助
你下面不是有logger.info这行代码 这是可以捕捉到异常的 ,看异常一点一点分析吧。
“如果有一条数据报错,那么全部数据都不能执行成功”,这个可以用oracle事务。
java倒是不大了解,应该可以根据oracle返回值判断事务是否执行成功,然后中断吧。
你看看报错信息,应该会有相关的SQL语句信息在里面,然后你再去找对应的SQL了。
查看日志文件,找对应的错误
你这里应该可以只记录索引 i 。异常时打印出来。
报错之前打印出来。或者存在局部变量中,catch异常之后,把这个局部变量的值打印出来。
例如:
String s=null;
try
{
x=next-data();
xxxxx
其他处理代码。
xxxx
}catch(Exception e){
这里打印s即可。
}
事务的特性,你虽然1000条执行一次,但是没有提交,如果有一条报错肯定都回滚了,你可以1000条执行一次,然后马上提交,这样如果一个批次出现异常,那么只会影响
这1000条,这1000条会回滚,然后查看后台日志,看看具体是哪一条
这是我打印的SQL。
我是想把所有的数据导进新的库中,其中我还要对数据进行相应的改变,所以需要写这个程序。
其次我要执行的任务是晚上下班时,将程序跑起来,然后第二天所有程序导进新的数据库,然后错误的数据能够打印到日志里面。
可以程序验证数据有效性,有误的log、跳过。
有人给我说过可以自定义异常,这样只要能定到是那条数据有错了,能拿到错误的Object数组就好处理了,所以想问问,到底该怎么做
我的一般处理方式是把num打印出来 , 比如在1000到2000条之间出错的话 , 就把批处理次数下降到100次 , 只打印1000到2000之间的num , 以此类推 , 就能找到具体的那一行了.
在你的catch处 logger.error(sql);
将你报异常的地方捕获,然后在捕获之后的处理的地方,将异常打印处理,不要抛出去。
你在异常里把这一行记录打印出来。。。
抛异常的时候把SQL打印出来。。
你catch异常的时候,不是知道是正在执行哪条数据的插入嘛。你就把这条数据的唯一标识打印出来不行吗?