Постоянные соединения с БД-да или нет?
Я использую PDO-слой PHP для доступа к данным в проекте, и я читал об этом и видел, что он имеет хорошую врожденную поддержку постоянных подключений к БД. Мне интересно, когда/если я должен использовать их. Буду ли я видеть преимущества производительности в приложении CRUD-heavy? Есть ли недостатки, которые следует учитывать, возможно, связанные с безопасностью?
Если это имеет значение для вас, я использую MySQL 5.x.
7 ответов
вы можете использовать это как грубый "набор правил":
Да используйте постоянные соединения, если:
- существует только несколько приложений/пользователей, обращающихся к базе данных, т. е. вы не приведете к 200 открытым (но, вероятно, простаивающим) соединениям, потому что на одном хосте есть 200 разных пользователей.
- база данных работает на другом сервере, к которому вы обращаетесь по сети
- приложение (one) получает доступ к базе данных очень часто
нет, не используйте постоянные соединения, если:
- вашему приложению требуется только доступ к базе данных 100 раз в час.
- у вас есть много веб-серверов, обращающихся к одному серверу баз данных
- вы используете Apache в режиме prefork. Он использует одно соединение для каждого дочернего процесса, которое может увеличиваться довольно быстро. (через @Powerlord в комментариях)
использование постоянных соединений значительно быстрее, особенно если вы получаете доступ к базе данных по сети. Не имеет большого значения, работает ли база данных на одном компьютере, но она все равно немного быстрее. Однако, как говорится в названии, соединение является постоянным, т. е. остается открытым, даже если оно не используется.
проблема в том, что в" конфигурации по умолчанию "MySQL разрешает только 1000 параллельных"открытых каналов". После этого новые соединения отказываются (вы можете настроить это установочный.) Поэтому, если у вас есть, скажем, 20 веб - серверов с каждым 100 клиентами, и каждый из них имеет только один доступ к странице в час, простая математика покажет вам, что вам понадобится 2000 параллельных подключений к базе данных. Это не сработает.
Ergo: используйте его только для приложений с большим количеством запросов.
короче говоря, мой опыт говорит, что постоянных соединений следует избегать, насколько это возможно.
обратите внимание, что 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
Итак, pl используйте постоянное соединение после достаточного обсуждения. Возможно, вы не захотите приглашать сложную среду выполнения проблемы для небольшого выигрыша, который вы получаете от постоянного соединения.
создание соединений с базой данных является довольно дорогостоящей операцией. Постоянные соединения-хорошая идея. В ASP.Net и Java world, у нас есть "пул соединений", что примерно одно и то же, а также хорошая идея.
IMO, реальный ответ на этот вопрос-это то, что лучше всего работает для вас. Я бы рекомендовал вам проверить ваше приложение, используя как постоянные, так и непостоянные соединения.
Мэгги Нельсон @ Объективно Ориентированной сообщение об этом в августе и Роберт Swarthout сделал сопроводительный пост с некоторыми жесткими номерами. Оба довольно хорошо читают.
по моему скромному мнению:
при использовании PHP для веб-разработки большая часть вашего соединения будет "жить"только в течение жизни страницы. Постоянное соединение будет стоить вам много накладных расходов, так как вам придется поместить его в сеанс или что-то в этом роде.
99% времени без постоянной связи, которая умирает в конце выполнения страницы будет работать нормально.
другой 1% времени, вы, вероятно, не должны использовать PHP для приложения, и нет идеального решения для вас.
Я собирался задать тот же вопрос, но вместо того, чтобы задавать тот же вопрос снова, я просто добавлю некоторую информацию, которую я нашел.
также стоит отметить, что новое расширение mysqli даже не включает возможность использовать постоянные подключения к базе данных.
Я все еще использую persitent соединения на момент, но планируют переключиться на non-persistent в ближайшем будущем.
В общем, иногда вам нужно будет использовать непостоянные соединения, и приятно иметь один шаблон для применения к дизайну подключения к БД (пока есть относительно мало преимуществ в использовании постоянных соединений в вашем контексте.)