处理BatchUpdateException中的多个错误

时间:2015-12-26 19:52:45

标签: java mysql batch-file prepared-statement

我使用批处理在数据库中插入大量记录。 如果其中任何一个失败,我只会在更新计数数组中获取记录号(和最后一个异常消息)。

是否可以解决所有错误的原因?

我正在使用Java7和Mysql连接器(5.1.35)。我还将自动提交设置为false。

1 个答案:

答案 0 :(得分:0)

是否可以解决所有错误原因?

是的,这是可能的。

  批量更新操作期间发生错误时抛出

BatchUpdateException。它提供(以及其他)批量更新期间成功执行的所有命令的更新计数。

     

BatchUpdateException类是SQLException的子类,它表示一个异常,提供有关数据库访问错误或其他错误的信息。

捕获BatchUpdateException

BatchUpdateException应该被 last catch子句捕获,因为它是SQLException的子类。您可以在它到达SQLException之前手动捕​​获它。

以下是示例代码

import java.sql.BatchUpdateException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;

public class CatchExceptionExample {

    private static final String HOST = "jdbc:mysql://localhost/";
    private static final String DB = "db_test";
    private static final String USER = "root";
    private static final String PASSWORD = "bitnami";

    public static void main(String[] args) {
        String sqlQuery = "INSERT INTO `tbl` (`id`, `name`, `surname`, `age`) VALUES (?,?,?,?)";

        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection(HOST+DB,USER,PASSWORD);
            PreparedStatement ps = conn.prepareStatement(sqlQuery);

            ps.setInt(1,6);
            ps.setString(2, "Name1");
            ps.setString(3, "Surname1");
            ps.setInt(4, 1);
            ps.addBatch();

            ps.setInt(1,1);
            ps.setString(2, "Name1");
            ps.setString(3, "Surname1");
            ps.setInt(4, 1);
            ps.addBatch();

            int[] affectedRecords = ps.executeBatch();

        } catch (BatchUpdateException ex) {
            int[] updateCount = ex.getUpdateCounts();

            int count = 1;
            for (int i : updateCount) {
                if  (i == Statement.EXECUTE_FAILED) {
                    System.out.println("Error on request " + count +": Execute failed");
                } else {
                    System.out.println("Request " + count +": OK");
                }
                count++;

            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

有关详细级别说明,请访问How to resolve Batch Update Exception链接。另外,请不要忘记阅读本文的有关BatchUpdateException的更多信息部分。