La risposta accettata non è il modo consigliato per gestire le operazioni batch. Non mostra le istruzioni batch vere poiché la modalità batch executor dovrebbe essere utilizzata quando si apre una sessione. Vedi questo post in cui un collaboratore del codice ha raccomandato che il modo corretto per aggiornare (o inserire) in batch è aprire una sessione in modalità batch e chiamare ripetutamente l'aggiornamento (o inserimento) per un singolo record.
Ecco cosa funziona per me:
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();
}
}
Non utilizzare foreach nel tuo aggiornamento/inserimento e assicurati che aggiorni/inserisca solo un singolo record. Stavo riscontrando errori di oracolo irrisolvibili facendolo in base alla risposta accettata (carattere non valido, istruzione non terminata, ecc.). Come indica il post collegato, l'aggiornamento (o inserto) mostrato nella risposta accettata è in realtà solo una gigantesca istruzione sql.