Вопрос или проблема
Я получаю эту ошибку в журналах MYSQL.
2025-01-01 9:02:42 8090 [Warning] Aborted connection 8090 to db: 'xxx' user: 'xxx' host: 'xxx' (Got an error reading communication packets)
Также я получаю эту ошибку в плагине на серверной стороне, когда эта ошибка MYSQL появляется на моей серверной стороне.
[09:02:42] [luckperms-worker-0/WARN]: [me.lucko.luckperms.lib.hikari.pool.PoolBase] luckperms-hikari - Failed to validate connection me.lucko.luckperms.lib.mysql.cj.jdbc.ConnectionImpl@52d3db29 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.
[09:02:42] [luckperms-worker-0/WARN]: java.sql.SQLTransientConnectionException: luckperms-hikari - Connection is not available, request timed out after 5002ms.
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:696)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.hikari.pool.HikariPool.getConnection(HikariPool.java:197)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.hikari.pool.HikariPool.getConnection(HikariPool.java:162)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.hikari.HikariDataSource.getConnection(HikariDataSource.java:100)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.common.storage.implementation.sql.connection.hikari.HikariConnectionFactory.getConnection(HikariConnectionFactory.java:169)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.common.messaging.sql.SqlMessenger.getConnection(SqlMessenger.java:84)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.common.messaging.sql.AbstractSqlMessenger.pollMessages(AbstractSqlMessenger.java:114)
[09:02:42] [luckperms-worker-0/WARN]: at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1423)
[09:02:42] [luckperms-worker-0/WARN]: at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
[09:02:42] [luckperms-worker-0/WARN]: at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312)
[09:02:42] [luckperms-worker-0/WARN]: at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843)
[09:02:42] [luckperms-worker-0/WARN]: at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808)
[09:02:42] [luckperms-worker-0/WARN]: at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188)
[09:02:42] [luckperms-worker-0/WARN]: Caused by: java.sql.SQLNonTransientConnectionException: No operations allowed after connection closed.
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:73)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.mysql.cj.jdbc.ConnectionImpl.setNetworkTimeout(ConnectionImpl.java:2495)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.hikari.pool.PoolBase.setNetworkTimeout(PoolBase.java:566)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.hikari.pool.PoolBase.isConnectionAlive(PoolBase.java:173)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.hikari.pool.HikariPool.getConnection(HikariPool.java:186)
[09:02:42] [luckperms-worker-0/WARN]: ... 11 more
[09:02:42] [luckperms-worker-0/WARN]: Caused by: me.lucko.luckperms.lib.mysql.cj.exceptions.ConnectionIsClosedException: No operations allowed after connection closed.
[09:02:42] [luckperms-worker-0/WARN]: at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
[09:02:42] [luckperms-worker-0/WARN]: at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
[09:02:42] [luckperms-worker-0/WARN]: at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.mysql.cj.NativeSession.checkClosed(NativeSession.java:1171)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.mysql.cj.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:573)
[09:02:42] [luckperms-worker-0/WARN]: at me.lucko.luckperms.lib.mysql.cj.jdbc.ConnectionImpl.setNetworkTimeout(ConnectionImpl.java:2491)
[09:02:42] [luckperms-worker-0/WARN]: ... 14 more
Когда я пытаюсь пинговать свой x-сервер на сервере базы данных, потеря пакетов происходит одновременно с каждой ошибкой mysql.
Я пытался изменить этот параметр конфигурации my.ini:
max_allowed_packet=16M по умолчанию,
max_allowed_packet=256M
Ответ или решение
Анализ проблемы с MySQL и предложенные решения
Вы столкнулись с ошибкой MySQL в журнале: [Warning] Aborted connection 8090 to db: 'xxx' user: 'xxx' host: 'xxx' (Got an error reading communication packets)
и связанной с ней ошибкой на стороне плагина сервера, использующего HikariCP для управления пулом подключений. Данные ошибки часто указывают на проблемы с сетью или конфигурацией серверного и клиентского ПО, которые могут привести к неожиданному завершению соединений с базой данных.
Анализ причин и рекомендации по решению
-
Проблемы сети:
Упоминается о потере пакетов при пинге, что может указывать на нестабильное сетевое соединение между сервером базы данных и вашим приложением. Для решения данной проблемы:- Проведите диагностику сети, используя утилиты, такие как
ping
,traceroute
, иnetstat
, чтобы выявить слабые места в сети. - Убедитесь, что ваш сетевой канал достаточен для обработки текущих объемов данных.
- Проверьте, нет ли временных отключений в сети, влияющих на стабильность соединения.
- Проведите диагностику сети, используя утилиты, такие как
-
Конфигурация MySQL:
- max_allowed_packet: Вы увеличили параметр
max_allowed_packet
с 16M до 256M. Это шаг в правильном направлении, так как недостаточный размер пакета может вызвать разрывы соединений, но проблема может заключаться и в другом. Убедитесь, что значение достаточно велико для обрабатываемых данных, но не превышает разумные пределы, чтобы избежать перерасхода памяти.
- max_allowed_packet: Вы увеличили параметр
-
Конфигурация HikariCP:
-
maxLifetime: Логи содержат рекомендацию уменьшить значение
maxLifetime
. Цель этой настройки — время, в течение которого соединение считается живым. Попробуйте уменьшить это значение до 30 минут или менее (например, 1800000 миллисекунд), чтобы убедиться, что HikariCP создает новые соединения раньше, чем MySQL их закроет из-за таймаута бездействия. -
Connection Timeout: Можете настроить
connectionTimeout
, чтобы он был быстрее, что позволит вашим рабочим процессам быстрее получать доступ к соединениям и не сталкиваться с таймаутами. Попробуйте установить значение в 3000 миллисекунд или меньше.
-
-
Таймауты на стороне MySQL:
- wait_timeout и interactive_timeout: Эти параметры определяют, как долго сервер ждет действий перед закрытием неактивных соединений. Увеличьте их значения, если ваши операции связаны с продолжительными процессами ожидающими ответов.
-
Логи и мониторинг:
- Обратите внимание на все сообщения об ошибках и предупреждениях в логах. Включите расширенные логи MySQL для более глубокого анализа.
-
Проблемы с конфигурацией драйвера MySQL:
- Убедитесь, что драйвер MySQL актуален и совместим с вашей версией MySQL.
Заключение
Это сложная проблема, которая требует внимания к множеству деталей конфигурации как на стороне сервера базы данных, так и на стороне вашего приложения. Последовательно применяйте описанные шаги для решения проблемы, начиная с диагностики сети и корректировки параметров конфигурации MySQL и вашего пула соединений в HikariCP. Будьте внимательны при внесении изменений и следите за логами для оценки эффективности принятых мер.