Oracle
 sql >> Base de données >  >> RDS >> Oracle

MyBatis Batch Insert/Update Pour Oracle

La réponse acceptée n'est pas la méthode recommandée pour gérer les opérations par lots. Il n'affiche pas de véritables instructions de lot puisque le mode exécuteur de lot doit être utilisé lors de l'ouverture d'une session. Voir cet article dans lequel un contributeur de code a recommandé que la bonne façon de mettre à jour (ou d'insérer) un lot consiste à ouvrir une session en mode batch et à appeler à plusieurs reprises la mise à jour (ou l'insertion) pour un seul enregistrement.

Voici ce qui fonctionne pour moi :

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();
    }
}

N'utilisez pas foreach dans votre mise à jour/insertion et assurez-vous qu'il ne met à jour/insère qu'un seul enregistrement. Je rencontrais des erreurs oracle insolubles en le faisant selon la réponse acceptée (caractère invalide, instruction non terminée, etc.). Comme l'indique le message lié, la mise à jour (ou l'insertion) indiquée dans la réponse acceptée n'est en fait qu'une déclaration SQL géante.