我使用批处理在数据库中插入大量记录。 如果其中任何一个失败,我只会在更新计数数组中获取记录号(和最后一个异常消息)。
是否可以解决所有错误的原因?
我正在使用Java7和Mysql连接器(5.1.35)。我还将自动提交设置为false。
答案 0 :(得分:0)
是否可以解决所有错误原因?
是的,这是可能的。
批量更新操作期间发生错误时抛出BatchUpdateException。它提供(以及其他)批量更新期间成功执行的所有命令的更新计数。
BatchUpdateException类是SQLException的子类,它表示一个异常,提供有关数据库访问错误或其他错误的信息。
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的更多信息部分。