Что происходит, когда пул соединений исчерпан? - PullRequest
8 голосов
/ 03 апреля 2012

Я читаю о пуле соединений SQLAlchemy, который по умолчанию имеет 5 соединений и по умолчанию переполнится до 10.

Если число кэшированных соединений будет превышено, что произойдет? Последующие запросы ставятся в очередь до тех пор, пока не станет доступно бесплатное соединение, или будет создано новое соединение, которое не входит в пул?

Кроме того, что происходит с неиспользуемыми соединениями, когда пул "переполнен" до максимального значения по умолчанию, равного 10? Разъединяются ли эти соединения после времени по умолчанию (как со стандартным пулом), или они освобождаются более агрессивно, чем стандартный пул?

Ответы [ 2 ]

14 голосов
/ 03 апреля 2012

Вы читаете о QueuePool, который управляет соединениями с базой данных для повышения производительности. Это делается путем удержания открытых незанятых соединений на случай, если вы захотите использовать их позже. Количество открытых соединений: pool_size = 5 (по умолчанию). Если вы откроете шестое соединение, одно из соединений в очереди будет закрыто, пока оно не используется. Если ни один из них не используется, QueuePool откроет дополнительные, вплоть до max_overflow = 10 (по умолчанию). Больше, и вы получите ошибку. Однако оба эти параметра являются настраиваемыми. Установите pool_size = 0, чтобы иметь неограниченное количество открытых соединений. Источник здесь

5 голосов
/ 03 апреля 2012

За Документы по SQLAlchemy ,

Когда количество извлеченных соединений достигнет размера, установленного в pool_size, дополнительные соединения будут возвращены до этого предела. Когда эти дополнительные подключения возвращаются в пул, они отключаются и отбрасываются. Из этого следует, что общее количество одновременных подключений, которые разрешит пул, составляет pool_size + max_overflow, а общее количество «спящих» подключений пул позволит это pool_size.

Так что да, переполненные соединения освобождаются более агрессивно, чем обычно спящие соединения.

Если вы посмотрите на источники QueuePool._do_get(), вы увидите, что значение TimeoutError возрастает, когда число соединений равно размеру пула + переполнение, и соединение не возвращается обратно в пул вскоре после вызова connect() .

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