2012-09-25 27 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

相关问题