Приетият отговор не е препоръчителният начин за обработка на пакетни операции. Той не показва истински пакетни оператори, тъй като режимът на пакетен изпълнител трябва да се използва при отваряне на сесия. Вижте тази публикация, в която сътрудник на код препоръчва, че правилният начин за пакетно актуализиране (или вмъкване) е да отворите сесия в пакетен режим и многократно да извикате актуализация (или вмъкване) за един запис.
Ето какво работи за мен:
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();
}
}
Не използвайте foreach във вашата актуализация/вмъкване и се уверете, че той актуализира/вмъква само един запис. Сблъсках се с неразрешими грешки на оракул, като го направих според приетия отговор (невалиден знак, изявление не е приключило и т.н.). Както показва свързаната публикация, актуализацията (или вмъкването), показана в приетия отговор, всъщност е просто гигантско sql изявление.