首先,我将尝试描述我愿意做的事情然后,我会问我的问题。 我需要做以下事情:
以下是我的实施
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:如果您需要更多详细信息,请随时提出!
答案 0 :(得分:1)
这不一定是坏方法,但你是对的,它可能真的很慢。如果我要执行这样的过程,插入或删除这么多行,我可能会在存储过程中完成所有操作。我的代码只执行proc,proc将处理列表和枚举(以及插入和删除)。