Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC批插入异常处理_Java_Sql_Oracle_Jdbc_Oracle10g - Fatal编程技术网

Java JDBC批插入异常处理

Java JDBC批插入异常处理,java,sql,oracle,jdbc,oracle10g,Java,Sql,Oracle,Jdbc,Oracle10g,每次执行程序时,我都在执行JDBC批插入(大约每次插入1000行)。但我无法正确处理某些记录引发的异常 假设1000条记录中的第100条记录由于无效数据或某个值的大小超过列大小而引发异常。一旦发生异常,剩余的记录将不会被插入,程序将在其间失败 我想要的是,即使第100条记录抛出异常,剩余的插入也应该像往常一样在我的程序结束之前发生 我不明白如何做到这一点。请建议 编辑: 下面是我在应用程序中使用的批插入示例代码。假设结果集有大约1000条记录 PreparedStatement ps = nul

每次执行程序时,我都在执行JDBC批插入(大约每次插入1000行)。但我无法正确处理某些记录引发的异常

假设1000条记录中的第100条记录由于无效数据或某个值的大小超过列大小而引发异常。一旦发生异常,剩余的记录将不会被插入,程序将在其间失败

我想要的是,即使第100条记录抛出异常,剩余的插入也应该像往常一样在我的程序结束之前发生

我不明白如何做到这一点。请建议

编辑:

下面是我在应用程序中使用的批插入示例代码。假设结果集有大约1000条记录

PreparedStatement ps = null;
while(rs.next()){
  //Retrieve the value and set it to a Prepared statement

  String name = rs.getString("Name");
  int age = rs.getInt("Age");
  ps.setInt(1, age);
  ps.setString(2, name);

  //Finally invoke addBatch
  ps.addBatch();
}

//Finally call the executeBatch method
ps.executeBatch();

如果第100条记录正在抛出异常,那么我只想从第100条记录触发该进程。是否有某种方法可以这样做,以便我可以从引发异常的记录开始重新启动进程,直到再次结束?如何实现这一点?

在看不到任何代码的情况下,我能给出的最好建议是在执行插入操作的代码周围包装一个try/catch块。您可能还需要在每次插入时提交插入(假设事务连接)。这将导致处理速度稍慢,但将允许您的程序继续


我认为一个更干净的方法是在插入之前尝试预先验证记录。如果我们一次只讨论1000条记录,那么这不应该是一个很大的处理负载

您声明正在执行一批批SQL语句,因此我假设您使用的是
executeBatch
。当您
executeBatch
一批语句时,有些语句可能会成功,有些语句可能会失败。如果一条语句失败,这并不意味着JDBC驱动程序回滚成功的语句。如果一条语句失败,JDBC驱动程序可能会选择尝试执行批处理中的所有语句,或者一旦语句失败,它可能会选择停止执行批处理中的语句(听起来就像您正在使用的驱动程序选择在出现故障时立即停止执行语句)


当批处理中的一条语句失败时,您应该得到一个
BatchUpdateException
。在异常处理程序中,需要调用
getUpdateCounts
。这将为您提供一个
int
数组,告诉您语句更新了多少行,一个
语句。SUCCESS\u NO\u INFO
表示语句成功但没有行计数可用,或者一个
语句。EXECUTE\u FAILED
表示语句失败。如果前99条语句成功,第100条语句生成错误,其余语句未执行,则应返回一个100元素数组,其中前99个元素表示成功,第100个元素表示
语句。执行失败
。然后,您的代码需要重试那些未执行的语句(在本例中为语句101-1000)。

我的原始帖子上有什么建议/帮助吗?我的原始帖子上有什么建议/帮助吗?