gpt4 book ai didi

java - JDBC批量插入异常处理

转载 作者:IT老高 更新时间:2023-10-28 20:52:48 26 4
gpt4 key购买 nike

每次执行我的程序时,我都会执行一次 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 条和第 1000 条记录触发该过程。有没有办法做到这一点,以便我可以从抛出异常向前的记录重新启动该过程,直到再次结束?如何做到这一点?

最佳答案

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

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

关于java - JDBC批量插入异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11298220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com