Как сохранить соединение с базой данных на веб-сервере Python - PullRequest
14 голосов
/ 14 июля 2011

Я смотрю учебник Flask, и он предлагает создать новое соединение с базой данных для каждого веб-запроса.Это правильный способ делать вещи?Я всегда думал, что соединение с базой данных должно быть создано только один раз для каждого потока.Это можно сделать, поддерживая приложение как поточно-ориентированное, с флешкой или другими веб-серверами python.

Ответы [ 4 ]

12 голосов
/ 14 июля 2011

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

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

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

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

Например, с Python и mysql вы можете перейти на PySQLPool .

9 голосов
/ 14 июля 2011

Является ли создание нового соединения каждым запросом способом?Нет. Для больших приложений мы настоятельно рекомендуем использовать SQLAlchemy (который может иметь настроенный пул соединений), даже если вы не заинтересованы в ORM.В документах есть раздел об этом: http://flask.pocoo.org/docs/patterns/sqlalchemy/#sql-abstraction-layer

3 голосов
/ 14 июля 2011

Вот хорошее сравнение производительности с различными решениями. (PostgreSQL)

Короткая версия: Посмотрите на pgBouncer

Длинная версия: http://www.askthepony.com/blog/2011/07/django-and-postgresql-improving-the-performance-with-no-effort-and-no-code/

0 голосов
/ 14 июля 2011

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

Что вы действительно хотите сделать, так это оптимизировать «время разрыва соединения», долю времени, в течение которого соединение установлено, но не выполняет никакой работы. В случае создания нового соединения с каждым запросом это мертвое время - это просто время установки и разрыва. Если установить соединение только один раз (для каждого потока), и оно никогда не испортится, то время простоя - это время простоя.

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

Очень загруженное приложение, которое использует пул соединений для поддержания открытых соединений, увидит только один вид мертвого времени; ожидание запросов, которые никогда не вернутся из-за плохого соединения. Простое решение этой проблемы состоит в том, чтобы выполнить известный, хороший запрос (который в MySQL записан SELECT 1) перед предоставлением соединения из пула для запроса и перезапустить соединение, если оно не возвращается быстро.

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