2008-09-08 2 views
42

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

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

ответ

58

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

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

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

NO, не использовать постоянные соединения, если:

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

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

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

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

+1

Кроме того, не используйте постоянные соединения, если вы используете Apache в режиме предварительного просмотра.Он использует одно соединение для каждого дочернего процесса, которое может быстро развиваться. – Powerlord 2008-11-10 19:28:49

+0

@BlaM, я не получаю ваш последний абзац. Не поддерживает ли постоянные соединения их повторное использование (вот и все?), Поэтому вам не нужны 2000 соединений, так как они будут повторно использоваться? Или вы имеете в виду ** каждый клиент ** имеет уникальное имя пользователя? Тем не менее, не будут ли старые постоянные соединения автоматически закрываться, когда они будут сделаны, чтобы освободить место для новых соединений? – Pacerier 2015-06-25 07:01:28

4

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

3

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

Maggie Nelson @Objectively Oriented опубликовал об этом в августе и Robert Swarthout сделал сопроводительный пост с некоторыми твердыми номерами. Оба довольно хорошо читают.

+2

Ссылка "Объективно ориентированная" отсутствует. – Pacerier 2015-06-25 07:23:37

+1

Мне не нравится этот ответ, потому что бенчмаркинг часто делается очень неточно. Он может выглядеть очень хорошо, когда ваш компьютер обращается к нему в «отличных от реальных шаблонах доступа» (что типично для тестов). Сроки очень важны, как и некоторые другие «трудно реплицируемые» условия, которые часто происходят в реальной жизни. Я бы предложил подумать об этом и избежать этого, если вам это не понадобится. Предварительная оптимизация - это первый грех. – 2016-06-15 16:16:48

0

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

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

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

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

0

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

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

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

0

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

9

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

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

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

1. Number of apache processes on one host 
2. Total number of hosts running apache 
3. wait_timout variable in mysql db server 
4. max_connections variable in mysql db server 
5. Number of requests served by one apache process before it is re-spawned 

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

Смежные вопросы