Постоянные подключения к базе данных - Да или Нет?

StackOverflow https://stackoverflow.com/questions/50303

Вопрос

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

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

Это было полезно?

Решение

Вы могли бы использовать это как приблизительный "набор правил".:

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

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top