执行插入/删除批处理spring-jdbc / mysql的最佳方法

时间:2012-09-25 14:26:18

标签: mysql sql batch-file spring-jdbc batch-updates

首先,我将尝试描述我愿意做的事情然后,我会问我的问题。 我需要做以下事情:

  • 列出与某些条件对应的所有行
  • 做一些测试(例如:检查它是否已经插入),如果测试通过然后将行插入另一个数据库
  • 删除行(是否通过测试)

以下是我的实施

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 个答案:

答案 0 :(得分:1)

这不一定是坏方法,但你是对的,它可能真的很慢。如果我要执行这样的过程,插入或删除这么多行,我可能会在存储过程中完成所有操作。我的代码只执行proc,proc将处理列表和枚举(以及插入和删除)。