Что происходит, когда пул соединений исчерпан?

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

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

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

2 ответов


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


Per SQLAlchemy docs,

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

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

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