Постоянные соединения с БД - да или нет? - PullRequest
46 голосов
/ 08 сентября 2008

Я использую PHP-слой PDO для доступа к данным в проекте, и я читал об этом и увидел, что он имеет хорошую встроенную поддержку постоянных соединений с БД. Мне интересно, когда / если я должен их использовать. Могу ли я увидеть выигрыш в производительности в CRUD-приложении? Есть ли минусы, возможно, связанные с безопасностью?

Если это важно для вас, я использую MySQL 5.x.

Ответы [ 7 ]

61 голосов
/ 09 сентября 2008

Вы можете использовать это как грубый «набор правил»:

ДА , используйте постоянные соединения, если:

  • Существует только несколько приложений / пользователей, осуществляющих доступ к базе данных, т. Е. Вы не получите 200 открытых (но, вероятно, неактивных) подключений, поскольку на одном хосте совместно используются 200 разных пользователей.
  • База данных работает на другом сервере, к которому вы обращаетесь по сети
  • (одно) приложение очень часто обращается к базе данных

НЕТ , не используйте постоянные соединения, если:

  • Вашему приложению необходим доступ к базе данных только 100 раз в час.
  • У вас есть много веб-серверов, обращающихся к одному серверу базы данных
  • Вы используете Apache в режиме prefork. Он использует одно соединение для каждого дочернего процесса, который может довольно быстро нарастить. (через @Powerlord в комментариях)

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

Проблема в том, что в «конфигурации по умолчанию» MySQL допускает только 1000 параллельных «открытых каналов». После этого в новых соединениях будет отказано (вы можете настроить этот параметр). Так что, если у вас есть, скажем, 20 веб-серверов с каждыми 100 клиентами, и каждый из них имеет доступ только к одной странице в час, простая математика покажет вам, что вам потребуется 2000 параллельных подключений к базе данных. Это не сработает.

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

9 голосов
/ 20 октября 2010

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

Обратите внимание, что mysql_close - это неоперация (no-op) для соединений, созданных с использованием mysql_pconnect. Это означает, что постоянное соединение не может быть закрыто клиентом по желанию. Такое соединение будет закрыто сервером mysqldb, если на соединении не будет выполнено никаких действий в течение времени, превышающего wait_timeout . Если wait_timeout является большим значением (скажем, 30 минут), то сервер базы данных mysql может легко достичь лимита max_connections . В таком случае mysql db не будет принимать любой запрос на соединение в будущем. Это когда ваш пейджер начинает подавать звуковые сигналы.

Во избежание достижения лимита max_connections , для использования постоянного соединения необходимо тщательно сбалансировать следующие переменные ...

  1. Количество процессов apache на одном хосте
  2. Общее количество хостов, на которых работает apache
  3. Переменная wait_timout на сервере MySQL DB
  4. переменная max_connections на сервере MySQL DB
  5. Количество запросов, обслуживаемых одним процессом apache перед его повторным вызовом

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

4 голосов
/ 08 сентября 2008

Создание соединений с базой данных - довольно дорогая операция. Постоянные связи - хорошая идея. В мире ASP.Net и Java у нас есть «пул соединений», что примерно то же самое, а также хорошая идея.

3 голосов
/ 08 сентября 2008

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

Мэгги Нельсон @ Объективно ориентированные опубликовали об этом в августе, а Роберт Суартаут сделал сопроводительный пост с некоторыми жесткими цифрами. Оба довольно хорошо читают.

0 голосов
/ 10 ноября 2008

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

0 голосов
/ 10 ноября 2008

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

Стоит также отметить, что более новое расширение mysqli даже не включает возможность использовать постоянные соединения с базой данных.

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

0 голосов
/ 09 сентября 2008

По моему скромному мнению:

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

99% времени одиночное непостоянное соединение, которое умирает в конце выполнения страницы, будет работать нормально.

В другие 1% случаев вам, вероятно, не следует использовать PHP для приложения, и для вас не существует идеального решения.

...