Что происходит, когда пул соединений исчерпан?
Я читаю о пуле соединений 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()
называется.