【发布时间】:2015-09-25 18:16:50
【问题描述】:
我有一个应用程序,我正在使用准备好的语句将 1000 行批量写入 SQL Server 数据库。现在,如果这些插入中的任何一个失败,我希望能够将有问题的行写入日志文件,这样数据就不会完全丢失。如果可能的话,我宁愿只写一行失败的日志,而不是全部 1000 行,所以我的问题是:
如果在插入表时有一行失败,比如发生主键冲突,是阻止插入整个批次,还是只有一行失败?如果批处理失败,我是否可以对准备好的语句进行某种循环,一个一个地执行每个查询,这样我就可以找出失败的行,并只记录该行?还是我实现这一点的唯一方法是为每个插入语句保留一个单独的数组,并在批处理失败时循环遍历该数组?
更多细节:
数据库类型:SQL Server 2008
连接库:java.sql
SQL 语句:
Insert into Table(Column1,Column2) Values (Value1, Value2)
Java 代码:
PreparedStatement prpStmt = dbConnection.prepareStatement(insertQuery.toString());
for (List lst : listOfValues){
prpStmt.setString(1,lst[0]);
prpStmt.setString(2,lst[1]);
prpStmt.addBatch();
dbCount++;
if (dbCount == DB_COUNT_LIMIT){
try {
prpStmt.executeBatch();
dbConnection.commit();
dbCount = 0;
prpStmt.clearBatch();
} catch (Exception e){
for (PreparedStatement ps : prpStmt.getBatches()){
if (!logToDBIndividually())
logToFile();
}
}
}
}
【问题讨论】:
-
您知道在任何给定时间内将处理多少条记录吗?
-
这取决于许多因素,其中包括所涉及的数据库、数据库配置、JDBC 驱动程序及其配置、JDBC 连接配置、您准备语句的 SQL 以及用于执行工作的 Java 代码。如何命名 DB 并呈现至少模型 Java 代码代表 SQL?
-
如果执行方式是逐语句的,批处理的概念将无济于事。在批处理的情况下,语句被推到一起。您可以执行列表中的语句来完成此操作。
-
@john-bollinger 添加了一些编辑以显示我希望实现的代码和数据库详细信息。 blahfunk 记录可能数以万计。 james-jithin 是的,我知道。我的想法是我将理想地执行大批量以节省时间。但是,如果某些事情失败了,我会逐个声明地找到失败的特定语句。
标签: java exception prepared-statement