【问题标题】:Handling multiple errors from a BatchUpdateException处理来自 BatchUpdateException 的多个错误
【发布时间】:2016-04-01 04:35:57
【问题描述】:

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

是否有可能得到所有错误的原因?

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

【问题讨论】:

    标签: java mysql batch-file prepared-statement


    【解决方案1】:

    是否有可能得到所有错误的原因?

    是的,有可能。

    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 部分。

    【讨论】:

    • 感谢您的快速回复,但实际上我的代码看起来是这样。例如,如果我有这个更新计数数组:[1, 1, 1, 1, 1, 1, -3, 1, 1, -3],我想知道这两个错误的原因(重复键、错误类型等)。在批量更新异常中,我只能找到最后一句话的原因……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 2010-11-11
    • 2017-05-16
    • 1970-01-01
    • 2012-08-14
    相关资源
    最近更新 更多