2012-03-21 280 views
3

目前我們的代碼使用JdbcTemplate的batchUpdate方法來進行批量插入。Spring JdbcTemplate batchUpdate處理異常

我的問題是任何異常的情況下,在更新如何處理它的一個(加入日誌只是假設),並繼續下一個更新的SQL語句?

還怎麼BATCHUPDATE()方法FO的JdbcTemplate處理異常?

這裏的代碼片段。

/** 
    * Saves the list of <code>Item</code> objects to the database in a batch mode 
    * 
    * @param objects 
    * list of objects to save in a batch mode 
    */ 
    public void save(final List<Item> listOfItems) { 

     for (List<Debit> list : listOfItems) { 
      getJdbcTemplate().batchUpdate(insertItem, new ItemBatchPreparedStatementSetter(list)); 
     } 
    } 
+1

漢鼎錯誤是不容易的,而且也沒有一個解決問題的辦法。這取決於你*想要如何處理它。 – skaffman 2012-03-21 17:18:18

+0

你使用了什麼數據庫? – alexkasko 2012-03-22 11:14:53

+0

其Oracle數據庫。 – minil 2012-03-22 13:13:11

回答

5

如何BATCHUPDATE()方法FO的JdbcTemplate處理異常?

批量更新行爲是undefined in JDBC

如果在間歇更新的命令之一無法正確執行,此方法拋出的BatchUpdateException,和JDBC驅動器可以或者可以不繼續處理批處理中剩餘的命令。

你應該檢查你的DBMS這種行爲。

無論如何,BatchUpdateException將在春季被捕獲,並在一些清理後作爲RuntimeException重新拋出(請參閱實施細節here)。例如 -

所有這個邏輯將與事務中交織在一起如果插入在事務範圍內,並且您通過事務邊界重新拋出RuntimeException - 事務(以及所有成功的插入)將被回滾。

所以期望「日誌錯誤行唯一的」批量邏輯不能在沒有額外的知識有效地實現你的DBMS,它是在批量插入在錯誤的JDBC驅動程序的行爲。

0

我跑進映入JDBC停止插入任何錯誤記錄的情況下,不繼續插入了同樣的問題。 下面是我的解決方法: - 在批量更新

// divide the inputlist into batches and for each batch :- 
for (int j = 0; j < resEntlSize; j += getEntlBatchSize()) { 
      final List<ResEntlDTO> batchEntlDTOList = resEntlDTOList 
        .subList(
          j, 
          j + getEntlBatchSize() > resEntlSize ? resEntlSize 
            : j + getEntlBatchSize()); 
      TransactionDefinition def = new DefaultTransactionDefinition(); 
      TransactionStatus status = transactionManager 
        .getTransaction(def); 
      try { 
       //perform batchupdate for the batch 
       transactionManager.commit(status); 
      } catch (Exception e) { 
       transactionManager.rollback(status); 
       //perform single update for the error batch 
      } 

     }