如何在 python Web 服务器中保留数据库连接
Posted
技术标签:
【中文标题】如何在 python Web 服务器中保留数据库连接【英文标题】:How to preserve database connection in a python web server 【发布时间】:2011-10-05 00:41:54 【问题描述】:我正在查看 Flask 教程,它建议为每个 Web 请求创建一个新的数据库连接。这是做事的正确方式吗?我一直认为数据库连接应该只为每个线程创建一次。可以做到这一点,同时将应用程序保持为线程安全的,使用烧瓶或其他 python web 服务器。
【问题讨论】:
【参考方案1】:出于学习目的可能是的。但是在生产环境中运行的实际应用程序中,这根本不是一个理想的情况。
通常,您总是希望在应用程序和数据库之间有一个连接池。无论您使用哪种语言/数据库,这都是一种常见的解决方案。
一个数据库连接池维护着许多打开的连接。应用层只需要一个没有被使用的连接,当应用层不再需要它们时,连接就会被释放。 “释放”是指它们被返回到池中以便再次使用。
底线,连接不是根据请求打开/关闭的。它们从/向数据库连接池获取/释放。
例如,对于 Python 和 mysql,您可以选择 PySQLPool。
【讨论】:
【参考方案2】:每个请求都创建一个新连接是可行的吗?不。对于大型应用程序,我们强烈建议使用 SQLAlchemy(可以配置连接池),即使您对 ORM 不感兴趣。文档实际上有一个部分:http://flask.pocoo.org/docs/patterns/sqlalchemy/#sql-abstraction-layer
【讨论】:
我尽量避免使用 ORM 路径,因为它增加了额外的抽象层,当事情可以很容易地直接完成时。 有没有比连接池更简单的解决方案?我可以轻松地保持一些连接打开。我将只有几个工人,所以每个工人一个连接不是问题。【参考方案3】:根据我的经验,经常关闭连接通常是个好主意。特别是,MySQL 喜欢关闭已空闲一段时间的连接,有时这会使持久连接处于陈旧状态,从而使应用程序无响应。
您真正想要做的是优化“死连接时间”,即连接已启动但未执行任何工作的时间部分。在为每个请求创建新连接的情况下,死区时间实际上只是设置和拆卸时间。如果只建立一次连接(每个线程),并且永远不会变坏,那么死时间就是空闲时间。
当您的应用程序只处理少数请求时,发生的连接数也将很少,因此保持连接打开并处于空闲状态并没有太大优势。另一方面,当应用程序非常繁忙时,连接几乎从不空闲,关闭将立即重新打开的连接也是浪费。在中间,当新请求有时会出现在飞行请求中时,但有时不会,您将不得不对池大小、请求超时等方面进行一些性能调整。
一个非常繁忙的应用程序,它使用连接池来保持连接打开,只会看到一种死区时间;等待由于连接变坏而永远不会返回的请求。解决此问题的一个简单方法是在提供从池到请求的连接之前执行一个已知的良好查询(在 MySQL 中拼写为 SELECT 1
),如果连接没有快速返回,则回收该连接。
【讨论】:
以上是关于如何在 python Web 服务器中保留数据库连接的主要内容,如果未能解决你的问题,请参考以下文章
如何将 QNAP Web 服务器连接到 Microsoft MS SQL
将 Python Flask Web 服务器应用程序连接到 DB2