Použití dávkového spouštěče je doporučený způsob, ale musíte to udělat správně.
Všiml jsem si dvou problémů.
- Nastavení správné velikosti dávky je důležité. propojená odpověď odešle všechna data na konci, což není příliš efektivní.
- Pomocí
${}
odkazovat na parametry činí každý příkaz jedinečným a zabraňuje ovladači v opětovném použití příkazu (v podstatě se ztrácí výhoda dávkového spouštěče). Viz tyto nejčastější dotazy pro rozdíl mezi#{}
a${}
.
Zde je typická dávková operace pomocí MyBatis.
Jako nejlepší batchSize
závisí na různých faktorech, měli byste měřit výkon pomocí skutečných dat.
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();
}
A zde je efektivní verze prohlášení o aktualizaci.
<update id="update">
UPDATE <include refid="tableName" />
SET
item_price = #{item.price},
update_time = #{item.updateTime}
WHERE id = #{item.id}
</update>