当连接池耗尽时会发生什么?

16

我正在了解SQLAlchemy的连接池技术,它默认使用5个连接,超过后最多可扩展到10个。

如果连接池中的缓存连接数量被超出,会发生什么情况?是等待直到有空闲连接可用,还是会创建一个新的连接来替代进入连接池的连接?

此外,当连接池已经"溢出"到其默认的最大值10时,未使用的连接会发生什么情况?这些连接是否会像标准连接池一样在默认时间后断开连接,还是会比标准连接池更积极地释放?

2个回答

19
您正在阅读有关 QueuePool 的内容,其可以管理数据库连接以提高性能。它通过保持空闲连接来实现这一点,以便稍后重用它们。它将保持开放的连接数为 pool_size=5(默认值)。如果您打开第六个连接,则队列中的一个空闲连接将被关闭。如果没有空闲连接,则 QueuePool 将会打开更多的连接,最多到 max_overflow=10(默认值)。超过这个数量,您将会收到一个错误提示。 但是,这两个参数都是可配置的。设置 pool_size=0 以获得无限制的开放连接。 这里是源代码

2
嗯,在文档链接中查看QueuePool.__init__,docstring 中写道:“pool_size 可以设置为0表示没有大小限制”。 - Rian Rizvi

7
根据SQLAlchemy文档,当已检出的连接数量达到pool_size设置的大小时,将返回额外的连接,直到达到此限制。但是,当这些额外的连接返回到池中时,它们会被断开并丢弃。因此,池允许的同时连接总数为pool_size + max_overflow,允许池中“休眠”的连接总数为pool_size。因此,溢出的连接比通常的休眠连接更容易被释放。如果您实际查看QueuePool._do_get()的源代码,您会发现当连接计数等于池大小+溢出时,并且在调用connect()后不久未返回连接时,它会引发TimeoutError异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接