Сравнение производительности между mybaits Batch ExecutorType и for_each Xml - PullRequest
0 голосов
/ 08 мая 2019

У меня есть список записей для вставки в БД с использованием моих приманок. Ранее мой код был что-то вроде:

for(Item item :  items){
    sqlSession.insert("insert", item);
}

Использование этого метода работает, но я обнаружил, что на сервере Mysql имеется динамический инкрементный диск DiskIO из-за количества элементов.

Поскольку у меня мало доступа к конфигурации MySql, и я надеюсь решить эту проблему с высоким диском, я нашел несколько возможных решений:

  1. с использованием ExecutorType.BATCH для sqlSession
  2. вставка нескольких значений в одном операторе вставки, например: insert into Item values <foreach collection="list" item="item" index="index" separator=","> (#{item.a}, #{item.b}...) </foreach>

У кого-нибудь есть идеи, какой из них подходит для решения моей проблемы с высоким уровнем дискового пространства и в чем основное различие между этими двумя решениями? спасибо.

1 Ответ

0 голосов
/ 08 мая 2019

Несмотря на то, что трудно предсказать влияние на дисковый ввод-вывод вашего сервера, метод 1 (с использованием ExecutorType.BATCH) является рекомендуемым способом.
Он в основном вставляет определенное количество элементов одновременно.
Поскольку он внутренне использует API пакетной операции JDBC, который предназначен для обработки множества строк, вы можете воспользоваться оптимизацией драйвера.

Примечания:

  • Важно найти правильный «размер партии». Пожалуйста, см. пример кода в другом ответе.
  • В случае MySQL добавление rewriteBatchedStatements=true к URL-адресу соединения обычно значительно повышает производительность.

Метод 2 (многострочная вставка) выполняет один оператор, связывающий все элементы одновременно.
Это может вызвать проблемы с памятью.

...