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
Using batch executor is the recommended way, but you need to do it properly.
Two issues that I noticed.
${}
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>