Всем привет.
Есть база на 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:
С данными точно нет проблем. Я пробовал копировать сам запрос прямо из лога в консоль mysql - он нормально выполняется:
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
Начинает падать на другой записи.
Собственно вопрос - что ещё можно посмотреть или настроить?