我有一個應用程序,我正在使用預處理語句將1000行批量寫入SQL Server數據庫。現在,如果任何這些插入失敗,我希望能夠將有問題的行寫入日誌文件,以便數據不會完全丟失。如果可能的話,我寧願只寫一條日誌失敗的行,而不是所有1000行,所以我的問題是這樣的:是否可以從Java PreparedStatement逐行插入?
如果在插入表時發生一行失敗,例如發生主鍵衝突,是整批阻止插入,還是隻有一行失敗?如果批處理失敗,是否可以在預處理語句中執行某種循環,逐個執行每個查詢,並以這種方式找出失敗的行,並僅記錄該行?或者是我實現這一目標的唯一方法,以便爲每個插入語句保留一個單獨的數組,並在批處理髮生故障時循環執行該操作?
更多的細節:
數據庫類型: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的Java代碼? –
如果執行風格是按語句聲明,批處理的概念將無濟於事。在批次情況下,這些陳述被推在一起。您可以執行列表中的語句來完成此操作。 –