AlexXYZ
@AlexXYZ
O Keep Clear O

MySQL, jdbc, insert/update executeBatch бесконечно повисает и уже не отпускает?

Всем привет.
Есть база на MySQL (5.7.17/19), jdbc 6.0.5 (6.0.6, 8.0.8), java 1.8.144 (Linux/Windows). База небольшая. Очень активно использую новомодный тип данных JSON. Сделаны триггеры, которые мониторят изменения и если пользователь поменял JSON, то сохраняют новые данные, а старые данные добавляют в таблицу логов. Так всё работает нормально.
Но в базе есть сервис синхронизации данные пользователей с 1С. Получить данные из 1С не проблема и тут всё нормально. Как только я получаю данные я создаю preparedStatement и набиваю его addBatch:
BasicDBList rows = (BasicDBList)com.mongodb.util.JSON.parse( json_data );
            // Обновить данные cv_users
            StringBuilder sb = new StringBuilder();
            sb.append("UPDATE cv_users SET json_version=?, json_data=cast(? as JSON) WHERE id=?; ");
=           ps = conn_mysql.prepareStatement(sb.toString());
            Options.debugMessage("Формирую executeBatch CheckPermissionAndUpdateCVUsers");
            for(int i=0; i<=rows.size()-1; i++) {
                BasicDBObject rows_i = (BasicDBObject)rows.get(i);
                String  str_id = (String)rows_i.get("id");
                id = Integer.parseInt(str_id);
                String  str_json_version = (String)rows_i.get("<blockquote></blockquote>json_version");
                json_version = Integer.parseInt(str_json_version);
                json_data = ((BasicDBObject) rows_i.get("json_data")).toString();
                ps.setInt(1, json_version);
                ps.setString(2, json_data);
                ps.setInt(3, id);
=               ps.addBatch();
            }
            Options.debugMessage("Выполняю executeBatch CheckPermissionAndUpdateCVUsers "+rows.size()+" шт.");
=           int[] res_update = ps.executeBatch();

Данные нормально заполняются (цикл отрабатывает полностью), а вот executeBatch нет. Вот это и есть проблема. Не могу заставить выполниться.

Что уже пробовал:
0. Разные версии коннектора, mysql-сервера (последний тоже), ставил базу на Linux/Windows.
1. По логированию нашёл запись, на которой всё останавливается:
my.cnf:

log_output = "FILE"
general_log_file = F:/install/mysql/5.7.19/mysql-5.7.19-winx64/query.log
general_log = 1
log_error = F:/install/mysql/5.7.19/mysql-5.7.19-winx64/error.log
# https://dev.mysql.com/doc/refman/5.7/en/server-sys...
log_error_verbosity = 3

tail:

59d802331c5be304865961.png

С данными точно нет проблем. Я пробовал копировать сам запрос прямо из лога в консоль mysql - он нормально выполняется:

59d80a140ab1f196407808.png

2. Если я перед отправкой данных немного их изменю (хоть добавлю пробел в JSON), то mysql данные примет и застопорится дальше на другой записи (но не на следующей, а может через 200-300 или +-). Причём у другой записи так же не будет никаких проблем и её команда из логов выполнится в консоли.
3. Заметил, то timeout-ы не работают. Т.е. если операция зависла на
ps.executeBatch();
то это навсегда, пока не скину процесс обновления в консоли сервера или не рестартану сервер.
4. В логах ошибок mysql ничего особенного.
5. Пробовал прогонять через обновление только эту запись (без других) - опять стопорится. Набирал пачку таких стопорящих записей - без толку. Ничего в этих записях нет такого особенного.
6. Пробовал отправлять не весь executeBatch, а по частям. Например и по 100 и по 10 штук, всё равно стопорится на этой записи.
7. Пробовал менять запрос. Например
sb.append("UPDATE cv_users SET json_version=?, json_data=? WHERE id=?; "); // Убрал cast
Начинает падать на другой записи.

Собственно вопрос - что ещё можно посмотреть или настроить?
  • Вопрос задан
  • 193 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы