Я пытаюсь вставить 2000 записей в таблицу Employee в пакетном режиме (используя mybatis). Мои требования: 1. Записать ошибку, если какая-либо из записей не вставлена. 2. Продолжить вставку, даже если какая-либо из записей не удалась. 3. Откат не должен происходить для другого, если какая-либо из записей не срабатывает. 4. Хорошая производительность.Ошибка при выпуске 2000 записей с использованием mybatis (версия 3.2.8)
Пример кода реализации Дао: Здесь я придумал 2 сценария.
Вызов 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 записей. Но я не могу регистрировать ошибки, а также останавливает вставку при возникновении исключения.
Вызов 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-й записи.
Пожалуйста, помогите мне с этим. Заранее спасибо.