Должен ли я пинговать сервер mysql перед каждым запросом?


Поэтому мне было интересно, должен ли я или не должен пинговать сервер mysql (mysqli_ping), чтобы убедиться, что сервер всегда активен перед запуском запроса?

Author: Rihards, 2010-06-23

9 answers

Вы не должны пинговать MySQL перед запросом по трем причинам:

  1. Это ненадежный способ проверки того, что сервер будет работать, когда вы попытаетесь выполнить свой запрос, он вполне может снизиться за время между ответом на пинг и запросом.
  2. Ваш запрос может завершиться ошибкой, даже если сервер работает.
  3. По мере увеличения объема трафика на ваш сайт вы будете добавлять много дополнительных накладных расходов в базу данных. Это не редкость в корпоративных приложениях, которые использовали этот метод видеть, как огромное количество ресурсов базы данных тратится впустую на пинги.

Лучший способ справиться с подключениями к базе данных - это обработка ошибок (попытка/перехват), повторные попытки и транзакции.

Подробнее об этом в блоге производительности MySQL: Проверка на наличие активного подключения к базе данных, считающегося вредным

В этом сообщении в блоге вы увидите, что 73 % нагрузки на этот экземпляр MySQL было вызвано приложениями, проверяющими, работает ли БД.

 22
Author: Sean Amos, 2010-06-23 19:05:12

Я этого не делаю. Я полагаюсь на тот факт, что у меня будет ошибка подключения, если сервер исчезнет, и я попытаюсь что-то сделать.

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

 12
Author: Ben S, 2010-06-23 17:25:55

Нет.

Проводите ли вы пинг, прежде чем переходить туда в браузере, просто чтобы убедиться, что сервер запущен?

 10
Author: timdev, 2010-06-23 17:26:55

Поэтому мне было интересно, должен ли я или не должен пинговать сервер mysql (mysqli_ping), чтобы убедиться, что сервер всегда активен перед запуском вопрос?

Не совсем. Если он не работает, вы узнаете об этом из сообщений об ошибках, поступающих через ваши запросы, или при подключении к базе данных. Вы можете получить ошибку mysql с помощью:

mysql_error()

Пример:

mysql_connect(......) or die(mysql_error());
 5
Author: Sarfraz, 2010-06-23 17:27:30

Это не стандартный способ справиться с этим... Если есть исключение, тогда вы с ним разберетесь.

Это чем-то похоже на разницу между проверкой существования файла перед попыткой его открыть или обнаружением исключения "файл не найден" при его возникновении... Если это очень, очень распространенная и вероятная ошибка, ее, возможно, стоит проверить раньше, но обычно выполнение должно проходить нормально, а исключения должны перехватываться и обрабатываться при их возникновении.

 2
Author: froadie, 2010-06-23 17:26:40

Вообще говоря, нет.

Однако, если у вас есть длительный сценарий, например, какой-то внутренний процесс, который называется заданием cron, где это может быть промежуток времени между подключением и последующими запросами, mysqli_ping() может быть полезно.

В этом случае полезно установить значение mysqli.reconnect в значение true в php.ini.

 1
Author: Pete, 2010-06-23 18:15:03

Нет.

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

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

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

 0
Author: BradC, 2010-06-23 18:28:45

Единственный раз, когда я могу придумать, как это сделать, - это если база данных
1. не критично для функционирования вашего приложения, и,
2. он имеет тенденцию находиться в автономном режиме.

Кроме этого, нет.

 0
Author: NotMe, 2010-06-23 18:31:09

Единственный раз, когда было бы целесообразно использовать ping, - это если бы вы внедряли свою собственную систему пула подключений к бд. Даже в этом случае я бы не пинговал перед каждым запросом, просто при каждом "подключении"/извлечении из пула.

 0
Author: daryn, 2010-06-23 20:29:37