Det accepterede svar er ikke den anbefalede måde at håndtere batchoperationer på. Den viser ikke sande batch-sætninger, da batch-udførelsestilstanden skal bruges, når du åbner en session. Se dette indlæg, hvor en kodebidragyder anbefalede, at den korrekte måde at batchopdatering (eller indsættelse) er at åbne en session i batch-tilstand og gentagne gange kalde opdatering (eller indsætte) for en enkelt post.
Her er hvad der virker for mig:
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();
}
}
Brug ikke foreach i din opdatering/indsættelse, og sørg for, at den kun opdaterer/indsætter en enkelt post. Jeg løb ind i uløselige orakelfejl ved at gøre det i henhold til det accepterede svar (ugyldigt tegn, udsagn ikke afsluttet osv.). Som det linkede indlæg indikerer, er opdateringen (eller indsættelsen), der vises i det accepterede svar, faktisk kun en kæmpe sql-sætning.