Зависание базы данных при загрузке большого объёма данных и попытке повторого подключения к ней

Я записываю большой объём данных в БД с помощью программы, после успешной записи данных все connection, открытые для записи, закрываются и возвращаются в пул. Это проверено.

Дальше я перезапускаю программу для записи данных в БД, для повторной записи и программа зависает навечно, т.к. взяв свободный connection из пула уже не может выполнять нужный оператор SQL на нём, похоже. Происходит какая-то блокирвока потока к ресурсу в базе и осободить потоки получается только при удалении БД.

При маленьком объёме данных такого бесконечного зависания не происходит. Так же не происходит зависания, пока не перезапустишь программу. Поток зависает при первом же обращении к базе только после перезагрузки.

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

На скриншоте предоставлен стэктрейс места, где зависает потоквведите сюда описание изображения


Ответы (1 шт):

Автор решения: pitstt

В некоторых случаях размер данных для одного batch может быть насколько большой, что его было бы удобнее разделить на несколько подбатчей. Это можно сделать вручную, например разбив коллекцию на несколько частей или лучше поручить Spring JDBC. Для использования subbatch необходимо реализовать (да да, ещё один) интефейс ParameterizedPreparedStatementSetter. В отличие от BatchPreparedStatementSetter он типизируется конкретным объектом и самостоятельно не управляет размером batch’а.

jdbcTemplate.batchUpdate(
ADD_QUERY,
orders,
BATCH_SIZE,
new OrderSetter());

в URL необходимо добавить ?rewriteBatchedStatements=true

→ Ссылка