Python Mysql连接池问题:值得吗?

Python Mysql连接池问题:值得吗?,python,mysql,sqlalchemy,connection-pooling,Python,Mysql,Sqlalchemy,Connection Pooling,我记得听说mysql中的连接过程比其他RDBMS设计得非常快,因此如果启用连接池,使用(SQLAlchemy)实际上不会有多大帮助 有没有人有这方面的经验 我对启用它持谨慎态度,因为如果某些代码对db连接执行了有状态操作,并且(可能是错误地)在其自身之后没有进行清理,通常在关闭连接时被清除的状态将被传播到后续代码中,从而获得一个可回收的连接。即使MySQL本身的连接部分非常光滑,可能仍然涉及到网络连接(无论是环回连接还是物理连接)。如果你提出了很多要求,那可能会非常昂贵。当然,这将取决于(通常情

我记得听说mysql中的连接过程比其他RDBMS设计得非常快,因此如果启用连接池,使用(SQLAlchemy)实际上不会有多大帮助

有没有人有这方面的经验


我对启用它持谨慎态度,因为如果某些代码对db连接执行了有状态操作,并且(可能是错误地)在其自身之后没有进行清理,通常在关闭连接时被清除的状态将被传播到后续代码中,从而获得一个可回收的连接。

即使MySQL本身的连接部分非常光滑,可能仍然涉及到网络连接(无论是环回连接还是物理连接)。如果你提出了很多要求,那可能会非常昂贵。当然,这将取决于(通常情况下)您的应用程序到底做了什么——如果您在每个连接上都做了大量工作,那么这将占主导地位,并且您不会获得太多收益


当有疑问时,基准测试-但我大体上相信一个连接池库(至少是一个信誉良好的库)应该能够正常工作并适当地重置东西。

连接池加快了速度,因为您不必每次执行数据库查询时都创建java.sql.connection对象。我使用Tomcat连接池连接mysql数据库,用于执行大量查询的web应用程序,在高用户负载期间,速度有明显提高

使用SQLA的连接池时,无需担心连接上的剩余状态,除非您的应用程序正在更改连接范围选项,如事务隔离级别(通常情况并非如此)。SQLA的连接池在其签入时对连接发出connection.rollback(),以便清除任何事务状态或锁

MySQL的连接时间可能非常快,特别是在同一台机器上通过unix套接字进行连接时。如果您确实使用连接池,您还需要确保在一段时间后连接被回收,因为MySQL的客户端库将自动关闭空闲超过8小时的连接(在SQLAlchemy中,这是池回收选项)


通过将连接池实现从默认的QueuePool更改为NullPool,您可以使用SQLA应用程序快速执行连接池与非连接池的功能配置,这是一个池实现,实际上并不池任何东西-当获取代理连接并随后关闭时,它会真正连接和断开连接。

简短回答:您需要对其进行基准测试

详细回答:这要看情况。MySQL的连接设置速度很快,所以避免这种成本并不是进行连接池的好理由。如果查询运行的次数少且速度快,那么您将获得成功,因为这样您将看到池的成功


另一个担忧是应用程序如何处理SQL线程。如果它不执行SQL事务,也不假设线程的状态,那么池就不会是问题。OTOH,依赖关闭线程来丢弃临时表或回滚事务的代码在池方面会有很多问题。

我用Django创建了一个简单的RESTful服务,并在连接池和不连接池的情况下对其进行了测试。在我的例子中,差异是相当明显的

在局域网中,如果没有它,响应时间在1到5秒之间。有了它,不到20毫秒。 结果可能会有所不同,但我用于MySQL和Apache服务器的配置是相当标准的低端配置


如果您在internet上提供UI页面,用户可能不会注意到额外的时间,但在我的情况下,这是不可接受的,因此我选择使用池。希望这对您有所帮助。

我在stackoverflow上发现了另一个问题/评论,表明Apache Commons DB连接池不好。这个问题是针对python的,不是针对Java的。@ZoranPavlovic实际上问题是针对MySQL的。如果设置了连接池,它会“帮助”MySQL。尽管OP以Python连接池客户端为例,但我并不认为它是问题的主要焦点。