2012-09-25 25 views
1

首先,我將嘗試描述我願意做的事情,然後我會問我的問題。 我需要做到以下幾點:執行插入/刪除批處理的最佳方法spring-jdbc/mysql

  • 列表對應於一些條件
  • 做一些測試的所有行(如:檢查是否它尚未插入),如果測試通過,那麼插入行另一個數據庫
  • 刪除行(是否通過測試與否)

以下是我的執行

List<MyObject> toAdd = new ArrayList<MyObject>(); 
for(MyObject obj:list){ 
    if(!notYetInserted(obj){ 
     toAdd.add(obj); 
    } 
} 
myObjectDAO.insertList(toAdd); 
myObjectDAO.deleteList(list); 

服務方法標記爲事務性。

在我的DAO方法deleteList和insertList非常相似,所以我只是把這裏插入的方法。

public void insertList(final List<MyObject> list){ 
String sql = "INSERT INTO table_test " + 
    "(col_id, col2, col3,col4) VALUES (?, ?, ?,?)"; 

List<Object[]> paramList = new ArrayList<Object[]>(); 

for (MyObject myObject : list) { 
    paramList.add(new Object[] {myObject.getColId(), 
     myObject.getCol2(), myObject .getCol3(), myObject.getCol4()} 
    ); 
} 
simpleJdbcTemplate.batchUpdate(sql, paramList);   

}

我不知道要執行這樣的操作的最佳方式,我讀here是呼籲更新的循環可能會拖慢系統(尤其是在我的情況裏,我將有大約100K插入/刪除一次)。我不知道DAO中的這些額外的循環是否會讓我的系統更慢,如果在處理該批次時反覆發生問題會發生什麼(我還想過將服務的測試轉移到DAO只有一個循環和一個額外的測試,我真的不知道這是個好主意)。所以,我希望你的建議。非常感謝。

PS:如果您需要更多的細節請隨時詢問!

回答

1

這不一定是一個壞的方法,但你是對的,它可能真的很慢。如果我要做一個像這樣的過程插入或刪除這麼多行,我可能會在存儲過程中完成所有操作。我的代碼只會執行proc,proc會處理列表和枚舉(以及插入和刪除)。

+0

感謝您的快速回答。我將測試您的解決方案並進行比較。再次感謝! – aslan

相關問題