Fastest way to update huge number of rows with input param List in MyBatis to Oracle db

后端 未结 1 1043
南笙
南笙 2020-12-12 07:15

I\'m updating huge amount of data by passing a variable List in MyBatis to Oracle DB.

Methods from this link are not efficient enough for me, the ways to commit upd

相关标签:
1条回答
  • 2020-12-12 08:14

    Using batch executor is the recommended way, but you need to do it properly.
    Two issues that I noticed.

    1. Setting a proper batch size is important. The linked answer sends all the data at the end which is not efficient very much.
    2. Using ${} to reference parameters makes each statement unique and prevents the driver from reusing the statement (the benefit of batch executor is lost, basically). See this FAQ for the difference between #{} and ${}.

    Here is a typical batch operation using MyBatis.
    As the best batchSize depends on various factors, you should measure the performance using the actual data.

    int batchSize = 1000;
    try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
      YourMapper mapper = sqlSession.getMapper(YourMapper.class);
      int size = list.size();
      for (int i = 0; i < size;) {
        mapper.update(list.get(i));
        i++;
        if (i % batchSize == 0 || i == size) {
          sqlSession.flushStatements();
          sqlSession.clearCache();
        }
      }
      sqlSession.commit();
    }
    

    And here is an efficient version of the update statement.

    <update id="update">
      UPDATE <include refid="tableName" />
      SET
        item_price = #{item.price},
        update_time = #{item.updateTime}
      WHERE id = #{item.id}
    </update>
    
    0 讨论(0)
提交回复
热议问题