Přijatá odpověď není doporučeným způsobem zpracování dávkových operací. Nezobrazuje skutečné dávkové příkazy, protože při otevírání relace by měl být použit režim dávkového spouštěče. Podívejte se na tento příspěvek, ve kterém přispěvatel kódu doporučil, že správným způsobem dávkové aktualizace (nebo vložení) je otevření relace v dávkovém režimu a opakované volání aktualizace (nebo vložení) pro jeden záznam.
Zde je to, co pro mě funguje:
public void updateRecords(final List<GisObject> objectsToUpdate) {
final SqlSession sqlSession = MyBatisUtils.getSqlSessionFactory().openSession(ExecutorType.BATCH);
try {
final GisObjectMapper mapper = sqlSession.getMapper(GisObjectMapper.class);
for (final GisObject gisObject : objectsToUpdate) {
mapper.updateRecord(gisObject);
}
sqlSession.commit();
} finally {
sqlSession.close();
}
}
Nepoužívejte foreach ve své aktualizaci/vkládání a ujistěte se, že aktualizuje/vkládá pouze jeden záznam. Narážel jsem na neřešitelné věštecké chyby tím, že jsem to dělal podle přijaté odpovědi (neplatný znak, příkaz neukončil atd.). Jak ukazuje odkazovaný příspěvek, aktualizace (nebo vložka) zobrazená v přijaté odpovědi je ve skutečnosti jen obří příkaz SQL.