Mysql连接池问题:值得吗?

2024-05-16 18:43:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我记得听说mysql中的连接过程被设计成与其他rdbmse相比非常快,因此如果启用连接池,那么使用a library that provides connection pooling(SQLAlchemy)实际上并不会有多大帮助。

有人有这方面的经验吗?

我不敢启用它,因为如果某些代码对数据库连接执行有状态的操作,并且(可能是错误地)不会在其自身之后进行清理,则通常在关闭连接时清理的状态将传播到获得循环连接的后续代码。


Tags: 代码数据库thatsqlalchemy过程状态错误library
3条回答

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

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

通过使用SQLA应用程序,您可以通过将池实现从默认的QueuePool更改为NullPool来快速地进行连接池与非连接池的测试,NullPool是一个实际上不进行任何池操作的池实现-当获取代理连接并在稍后关闭时,它会实际连接和断开连接。

简而言之:你需要对它进行基准测试。

长话短说:看情况而定。MySQL的连接设置速度很快,因此避免这种成本并不是连接池的好理由。如果查询运行得很少而且速度很快,那么您将看到池的成功。

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

即使MySQL本身的连接部分非常流畅,也可能还涉及到网络连接(无论是环回还是物理连接)。如果你提出大量的请求,那可能会非常昂贵。当然,这将取决于应用程序的具体功能(这是经常发生的情况),如果每个连接都要做大量的工作,那么这将占主导地位,而且不会有太多收获。

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

相关问题 更多 >