Должен ли я пинговать MySQL сервер перед каждым запросом? - PullRequest
13 голосов
/ 23 июня 2010

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

Ответы [ 9 ]

23 голосов
/ 23 июня 2010

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

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

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

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

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

12 голосов
/ 23 июня 2010

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

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

10 голосов
/ 23 июня 2010

номер

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

5 голосов
/ 23 июня 2010

Так что мне было интересно, должен ли я или не должен пинговать сервер MySQL (mysqli_ping), чтобы убедиться, что Сервер всегда жив до запуска запрос

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

mysql_error()

Пример:

mysql_connect(......) or die(mysql_error());
2 голосов
/ 23 июня 2010

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

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

1 голос
/ 23 июня 2010

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

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

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

0 голосов
/ 24 июня 2010

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

0 голосов
/ 23 июня 2010

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

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

0 голосов
/ 23 июня 2010

Нет.

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

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

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

...