0

Я пытаюсь вставить 2000 записей в таблицу Employee в пакетном режиме (используя mybatis). Мои требования: 1. Записать ошибку, если какая-либо из записей не вставлена. 2. Продолжить вставку, даже если какая-либо из записей не удалась. 3. Откат не должен происходить для другого, если какая-либо из записей не срабатывает. 4. Хорошая производительность.Ошибка при выпуске 2000 записей с использованием mybatis (версия 3.2.8)

Пример кода реализации Дао: Здесь я придумал 2 сценария.

  1. Вызов sqlSession.commit() вне цикла.

    SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(ExecutorType.BATCH); 
        BatchMapper batchMapper = sqlSession.getMapper(BatchMapper.class); 
        try 
        { 
         for(Employee e: empList){ 
         batchMapper.addEmployee(e); 
         } 
        } 
        catch (Exception ex) 
        { 
    
        } 
        finally{ 
         sqlSession.commit(); 
         sqlSession.close(); 
        } 
    

    В этом случае sqlSession.commit() находится за пределами цикла for. Здесь вставка происходит для всех записей сразу после вызова sqlSession.commit(). Здесь производительность хороша, и требуется 4 секунды для вставки 2000 записей. Но я не могу регистрировать ошибки, а также останавливает вставку при возникновении исключения.

  2. Вызов sqlSession.commit() внутри цикла.

    SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(ExecutorType.BATCH); 
        BatchMapper batchMapper = sqlSession.getMapper(BatchMapper.class); 
        try 
        { 
        for(Employee e: empList){ 
         batchMapper.addEmployee(e); 
         sqlSession.commit(); 
         } 
        } 
        catch (Exception ex) 
        { 
    
        } 
        finally{ 
         sqlSession.close(); 
        } 
    

    В этом случае sqlSession.commit() находится внутри цикла for. Здесь вставка происходит один за другим, когда мы вызываем sqlSession.commit(). Здесь производительность не очень хорошая, и требуется 10 минут для вставки 2000 записей. Но я могу регистрировать ошибки и продолжать вставку, даже если исключение происходит для 100-й записи.

Пожалуйста, помогите мне с этим. Заранее спасибо.

ответ

0

Если вы используете java 8, попробуйте использовать параллельный поток с использованием лямбда-выражений.

empList.stream().parallel().forEach(s -> { 
     try{ 
      batchMapper.addEmployee(e); 
      sqlSession.commit(); 
     } catch(Exception ex){ 

     } 
    });