2012-07-02 173 views
15

我每次執行程序時都執行JDBC批量插入操作(每次大約插入1000行)。但我無法正確處理由某些記錄引發的異常。JDBC批量插入異常處理

假設1000條記錄中的第100條記錄由於數據無效或某個值的大小超出列大小而引發異常。一旦發生異常,其餘記錄不會被插入並且程序在兩者之間失敗。

我想要的是即使第100條記錄拋出異常,其餘的插入應該像平常一樣在我的程序結束之前發生。

我無法理解如何實現這一點。請建議。

編輯:

這裏是一個示例代碼,我用我的應用程序爲批量插入。假設結果集有大約1000條記錄。

PreparedStatement ps = null; 
while(rs.next()){ 
    //Retrieve the value and set it to a Prepared statement 

    String name = rs.getString("Name"); 
    int age = rs.getInt("Age"); 
    ps.setInt(1, age); 
    ps.setString(2, name); 

    //Finally invoke addBatch 
    ps.addBatch(); 
} 

//Finally call the executeBatch method 
ps.executeBatch(); 

如果100記錄被拋出一個異常,那麼我想只從第100太1/1000記錄觸發的過程。有沒有辦法做到這一點,以便我可以重新啓動從異常開始到最後的記錄的過程?如何實現這一目標?

+2

而你的代碼是? – Alfabravo

回答

0

在沒有看到任何代碼的情況下,我可以給出的最佳建議是在代碼中包裝一個try/catch塊來完成插入操作。您也可能需要在每次插入時提交插入(假設事務連接)。這會導致處理速度稍慢,但會讓您的程序繼續。

我認爲一個更乾淨的方法是嘗試在插入前預先驗證記錄。如果我們一次只談1000條記錄,那麼這不應該成爲很大的處理負擔。

+0

對我的原創帖子有什麼建議/幫助? – user182944

25

您聲明您正在執行批量的SQL語句,因此我假設您正在使用executeBatch。當您批量陳述時,某些陳述可能會成功,並且某些陳述可能會失敗。如果一條語句失敗,那並不意味着JDBC驅動程序回滾成功的語句。如果一個語句失敗,JDBC驅動程序可能會選擇嘗試執行批處理中的所有語句,或者一旦語句失敗,它可能會選擇停止執行批處理語句(這聽起來像您使用的驅動程序選擇將執行語句停止爲一旦出現故障)。

當批處理中的一條語句失敗時,您應該得到一個BatchUpdateException。在您的異常處理程序中,您需要撥打getUpdateCounts。這會給你一個int的數組,告訴你語句更新了多少行,Statement.SUCCESS_NO_INFO表示語句成功但沒有行數可用,或者Statement.EXECUTE_FAILED表明語句失敗。如果前99個語句成功,第100個語句會生成一個錯誤,其餘語句不會執行,您應該返回一個100個元素的數組,其中前99個元素表示成功,第100個元素表示Statement.EXECUTE_FAILED。然後,您的代碼將需要重試那些未執行的語句(在這種情況下,語句101-1000)。

+0

對我的原創帖子有什麼建議/幫助? – user182944