Почему мое sql соединение с пулом внезапно закрывается - PullRequest
1 голос
/ 06 января 2020

Я использую пул для создания очередей для моей базы данных в классе, в то время как я запускаю этот класс в 16 экземплярах (с ограничением 100 соединений на каждого - я не знаю, имеет ли это большое число какое-либо отношение к ошибка)

И вдруг через некоторое время запуска приложение вылетает с ошибкой «Pool Closed», пока единственное место - это использование pool.end () в конце apllciation.

1 Ответ

0 голосов
/ 06 января 2020

Это редкий MySQL сервер, который может обрабатывать все, что близко к 1600 соединениям. Если у вас есть один из этих серверов, вы это знаете: вы платите небольшое состояние за оборудование, и, вероятно, у вас есть команда администраторов баз данных, которая за ним присматривает.

Здесь есть некоторый парадокс: больше соединений с производственными MySQL серверами обычно замедляют работу. Почему? Когда многие соединения представляют похожие запросы к серверу, они часто конкурируют друг с другом.

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

Редактировать Другая проблема приложения, ваша проблема, заключается в повторном использовании соединения, пока к нему еще активен запрос. MySQL сообщает об этом с помощью Packets out of order сообщений. Если у вас есть настройка вложенного запроса, подобная этому псевдокоду

  for each item in SELECT some query
     for each detail in SELECT some query WHERE something = (item value from outer query)

, то для каждого запроса требуется свое собственное соединение. Если вы добавите новый запрос к первому соединению, пока оно все еще дает результаты предыдущего, MySQL запутается и скажет Packets out of order.

Pro tip Используйте каждое соединение только для одного запроса, затем .release() его к пулу.

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

Попробуйте запустить приложение с максимальным размером пула 5 для каждого экземпляра. Убедитесь, что вы правильно установили параметры пула : waitForConnections должно быть истинным, и вы должны разрешить высокий (или 0) poolLimit.

Если у вас было время и аппетит к сложности, вы могли бы написать небольшое гнездо обработчиков событий пула , чтобы отслеживать, как долго запросы пула остаются в их очереди. Если он окажется слишком длинным, вы можете сделать максимальный размер пула немного большим (например, 6, а не 5).

Pro tip Отладка с очень небольшим количеством соединений в вашем бассейне. Вы найдете свои ошибки быстрее.

...