如何在python web服务器中保留数据库连接

如何在python web服务器中保留数据库连接,python,mysql,flask,Python,Mysql,Flask,我正在看Flask教程,它建议为每个web请求创建一个新的数据库连接。这是正确的做事方式吗?我一直认为每个线程只应该创建一次数据库连接。在使用flask或其他python web服务器将应用程序保持为线程安全的情况下,可以做到这一点。出于学习目的,可能是的。但在实际应用程序中,在生产环境中运行,这根本不是一个理想的情况 通常,您总是希望在应用程序和数据库之间有一个连接池。无论您使用何种语言/数据库,这都是一种常见的解决方案 数据库连接池维护许多打开的连接。应用层只接受一个未被使用的连接,当应用层

我正在看Flask教程,它建议为每个web请求创建一个新的数据库连接。这是正确的做事方式吗?我一直认为每个线程只应该创建一次数据库连接。在使用flask或其他python web服务器将应用程序保持为线程安全的情况下,可以做到这一点。

出于学习目的,可能是的。但在实际应用程序中,在生产环境中运行,这根本不是一个理想的情况

通常,您总是希望在应用程序和数据库之间有一个连接池。无论您使用何种语言/数据库,这都是一种常见的解决方案

数据库连接池维护许多打开的连接。应用层只接受一个未被使用的连接,当应用层不再需要这些连接时,这些连接就会被释放。我所说的“释放”是指它们返回池中以便再次使用

底线是,连接不是按请求打开/关闭的。它们从数据库连接池中获取/释放


例如,使用Python和mysql,您可以使用。

是否正在为每个请求创建一个新连接?不可以。对于大型应用程序,我们强烈建议使用SQLAlchemy(可以配置连接池),即使您对ORM不感兴趣。文档中有一节实际上是这样的:

根据我的经验,经常关闭连接通常是个好主意。特别是,MySQL喜欢关闭闲置了一段时间的连接,有时会使持久连接处于过时状态,从而使应用程序无响应

您真正想要做的是优化“死连接时间”,即连接启动但不起任何作用的时间。在为每个请求创建新连接的情况下,死区时间实际上只是安装和拆卸时间。如果只建立一个连接一次(每个线程),并且它永远不会坏,那么死区时间就是空闲时间

当您的应用程序仅服务于几个请求时,发生的连接数也将很小,因此保持连接打开并没有多大好处,而是处于空闲状态。另一方面,当应用程序非常繁忙时,连接几乎从不空闲,关闭一个将立即重新打开的连接也是浪费时间。在中间,当在飞行请求中有时会出现新的请求,但有时没有,则必须对池大小、请求超时等进行一些性能调整。


一个非常繁忙的应用程序,使用连接池保持连接打开,只会看到一种死区时间;正在等待由于连接已损坏而永远不会返回的请求。这个问题的一个简单解决方案是,在提供从池到请求的连接之前,执行一个已知的、良好的查询(在MySQL中拼写为
SELECT 1
),如果连接没有快速返回,则循环使用连接。

我试图避免ORM路径,因为它增加了一个额外的抽象层,当事情可以轻松直接完成时。有没有比连接池更简单的解决方案?我可以很容易地维持一些联系。我将只有几个工人,所以每个工人一个连接不是问题。