使用具有不同部署环境的SQLAlchemy连接池

时间:2014-02-28 15:22:08

标签: sqlalchemy gunicorn pooling

我一直在阅读connection pooling上的SQLAlchemy文档,而这个主题本身很简单;我认为这与您部署应用程序的方式有很大关系(我在这里谈论WSGI应用程序)。

最近我开始使用Gunicorn。它有几种工人类型。目前我只使用同步工作者:那些一次处理单个请求的人#34;。

所以在这种情况下,最好使用StaticPool,即每个工作者有一个可重用的连接?或者,即使在同步工作者的情况下,SQLAlchemy也可以尝试建立多个连接? - 假设应用程序本身不使用线程。

1 个答案:

答案 0 :(得分:3)

完全有理由坚持使用默认的QueuePool

  1. QueuePool仅打开与当时要求的连接数一样多的连接。如果您的应用一次只使用一个连接,则这是您的应用打开的唯一连接。

  2. SQLAlchemy本身永远不会打开除了你告诉它之外的其他连接(任何需要数据库访问的东西基本上都会使用单个连接来访问数据库。比如create_all()或Session.query()。它一次只使用一个连接。)。

  3. 如果您的应用确实碰巧有某种事情一次发生多个连接,例如,一次使用两个Session对象,或者在您仍在提取时调用engine.execute()来自另一个engine.execute()的结果,QueuePool将设置第二个连接没有任何问题。而StaticPool将使用相同的连接,然后你会遇到问题。

  4. 如果你真的想确保你的应用程序每个进程只使用一个连接,你可以查看AssertionPool - 这更像是一个调试/测试池,不一定是我们用过的在规模。或者使用pool_size = 1和max_overflow = 0设置QueuePool,如果你试图在一个线程中同时打开两个连接,这基本上会导致死锁....