2016-09-21 74 views
0

我正在嘗試使用批量更新來更新表中的數據。當我更新數據時,會出現一些故障。我想獲取失敗查詢的更新語句。例如,如果失敗的查詢是"update table set abc= 123"。然後我想讓異常處理程序返回這個SQL查詢。使用BatchUpdateExcpetion進行JDBC BatchUpdate異常處理

我已經嘗試了幾種方法來獲取SQL查詢,但我無法這樣做。

下面是代碼:

String line=null; 
int cnt=0; 
int batchSize=100; 
BufferedReader br2=new BufferedReader(new FileReader("clean.txt")); 
stmt1=conn.createStatement(); 
while((line = br2.readLine()) != null) 
{ 
    try { 
     String sql = line; 
      stmt1.addBatch(sql); 
     //System.out.println(cnt); 
      if(++cnt % batchSize == 0) 
      { 
       stmt1.executeBatch(); 
       conn.commit(); 
      }       
     } 
    catch (BatchUpdateException ex) { 
     System.out.println(ex.getLocalizedMessage()); 
       int[] updateCount = ex.getUpdateCounts(); 
        int cnt1 = 1; 
        for (int i : updateCount) { 
         if (i == Statement.EXECUTE_FAILED) { 
          System.out.println("Error on request " + cnt1 +": Execute failed"); 
         } else { 
          System.out.println("Request " + cnt1 +": OK"); 
         } 
         cnt1++; 
        } 
       } 
} 
System.out.println("done"); 
br2.close(); 

請讓我知道我應該怎麼做才能失敗的SQL查詢。所以,如果我有查詢,我可以再次將它存儲在文件中。

回答

0

getUpdateCounts的確切含義取決於驅動程序實現:JDBC規範允許要麼只有包含了成功的更新計數第一次失敗之前執行的語句,或者它包含的所有語句執行,其故障都標有值爲EXECUTE_FAILED;從BatchUpdateException

之後以間歇更新的命令無法正確執行以及BatchUpdateException被拋出,駕駛員可能或可能不繼續處理在批處理中的剩餘命令。如果驅動程序在故障發生後繼續處理,則方法BatchUpdateException.getUpdateCounts返回的數組將對批處理中的每個命令都有一個元素,而不僅僅是在錯誤發生前成功執行的命令的元素。在驅動程序繼續處理命令的情況下,任何失敗命令的數組元素是Statement.EXECUTE_FAILED

換句話說,如果你想知道失敗的語句有兩種情況處理:

  1. 更新的長度計算陣列比批處理的語句的數量。
    在這種情況下,第一個(數組長度)語句已成功執行。聲明(數組長度)+ 1失敗,其餘的語句尚未執行。
  2. 數組的長度等於批處理語句的數量。
    在這種情況下,您可以遍歷數組,並且值爲Statement.EXECUTE_FAILED的所有索引都是失敗語句。

對於這兩種情況,您都需要做記錄來跟蹤批處理中的哪些語句,並將它們與失敗和/或未執行語句的索引進行匹配。