我正在阅读有关SQLAlchemy的连接池的信息,该连接池默认为5个连接,默认情况下溢出为10个。
如果超出缓存连接数,会发生什么?后续请求是否排队,直到有空闲连接可用,或者是否会创建未进入池的新连接?
此外,当池“溢出”到其默认最大值10时,未使用的连接会发生什么?这些连接是在默认时间之后断开连接(与标准池一样),还是比标准池更积极地释放?
答案 0 :(得分:14)
您正在阅读QueuePool,它管理数据库连接以获得更好的性能。它通过保持打开空闲连接来实现,以防您以后想要重用它们。它将保持打开的连接数为pool_size = 5(默认值)。如果打开第六个连接,则只要空闲,就会关闭队列中的一个连接。如果没有空闲,QueuePool将打开其他的,最多max_overflow = 10(默认值)。更多,你会得到一个错误。 但是,这两个参数都是可配置的。设置pool_size = 0以具有无限制的打开连接。 The source is here
答案 1 :(得分:5)
当签出的连接数达到
pool_size
中设置的大小时,其他连接将返回到此限制。 当这些附加连接返回到池时,它们将被断开并被丢弃。接下来,池将允许的同时连接总数为pool_size + max_overflow
,并且总数为“睡觉“池允许的连接是pool_size
。
所以,是的,溢出的连接比正常睡眠连接更积极地释放。
如果您实际查看QueuePool._do_get()
的来源,当连接计数等于池大小+溢出时,您会看到它引发TimeoutError
,并且在{之后很快就没有连接返回到池中{1}}被调用。