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

问题描述:

我在阅读有关SQLAlchemy的连接池,默认为5个连接,默认情况下溢出为10.当连接池耗尽时会发生什么?

如果超过缓存连接的数量,会发生什么情况?随后的请求将排队,直到空闲连接变为可用或将创建一个不进入池的新连接?

另外,当池已经“溢出”到默认的最大值10时,未使用的连接会发生什么?这些连接在默认时间后是否断开连接(与标准池一样),还是比标准池更激进?

您正在阅读有关QueuePool的信息,它管理数据库连接以获得更好的性能。它通过保持打开的空闲连接来做到这一点,以防以后再使用它们。它将保持打开的连接数是pool_size = 5(默认值)。如果您打开第六个连接,则只要该连接处于空闲状态,队列中的其中一个连接就会关闭。如果没有空闲,QueuePool将打开更多的,最多max_overflow = 10(默认)。任何更多,你会得到一个错误。 但是这两个参数都是可配置的。设置pool_size = 0可以有无限的开放连接。 The source is here

+0

pool_size = -1 for unlimited。 – zzzeek 2012-04-15 21:47:33

+1

嗯,在链接到文档,看看QueuePool .__ init__,文档字符串说“''pool_size''可以设置为0来表示没有大小限制” – 2012-04-16 04:40:25

+0

哦,你是对的我在看pool_recycle – zzzeek 2012-04-16 19:21:44

SQLAlchemy docs

当签出的连接数达到大小pool_size设置,附加的连接将返回到这个限制。 当这些附加连接返回到池时,它们将被断开并丢弃。然后,池将允许的同时连接总数为pool_size + max_overflow,池允许的“休眠”连接总数为pool_size

所以,溢出的连接比正常休眠的连接更加积极。

如果你真的看的QueuePool._do_get()来源,你会看到,它提出了一个TimeoutError当连接数等于池的大小+溢出,并返回到connect()被称为后不久池中没有连接。