15

我记得听说 mysql 中的连接过程与其他 RDBMS 相比设计得非常快,因此如果启用连接池,使用提供连接池 (SQLAlchemy) 的库实际上对您没有太大帮助。

有人对这个有经验么?

我对启用它持怀疑态度,因为如果某些代码对数据库连接执行有状态的操作并且(可能是错误地)没有自行清理,那么通常会在关闭连接时清理的状态将改为传播到获得回收连接的后续代码。

4

5 回答 5

10

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

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

您可以通过将池实现从默认的 QueuePool 更改为 NullPool 来快速对 SQLA 应用程序进行一些连接池与非连接池的比较,这是一个实际上不池化任何东西的池实现 - 当代理连接被获取并稍后关闭。

于 2009-01-02T02:41:50.470 回答
6

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

如有疑问,基准测试 - 但我基本上相信连接池库(至少,一个有信誉的库)应该正常工作并适当地重置。

于 2009-01-01T19:37:35.787 回答
2

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

长答案:这取决于。MySQL 的连接设置速度很快,因此避免这种成本并不是使用连接池的好理由。如果查询运行的速度很少且速度很快,那么您会在哪里获胜,因为这样您就会看到池化的胜利。

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

于 2009-01-06T00:10:55.863 回答
0

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

于 2009-01-01T20:02:42.227 回答
0

我使用 Django 制作了一个简单的 RESTful 服务,并在使用和不使用连接池的情况下对其进行了测试。就我而言,差异非常明显。

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

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

于 2011-10-20T19:00:38.187 回答