使用 PgBouncer 时,我可以/应该禁用 Ruby On Rails 数据库连接池吗?

Can I / Should I disable Ruby On Rails Database Connection Pooling when using PgBouncer?

我可以在 Rails 连接池上完全禁用 Ruby 吗?

考虑到 PgBouncer 已经处理数据库连接池,这样可以吗?

没有

PgBouncer 将自己宣传为 Postgres 服务器,然后管理与实际 Postgres 服务器的连接。除了 PgBouncer,我们不需要深入了解更多细节——从 Rails 方面来看,PgBouncer 实例 Postgres 服务器,所以让我们解释一下原因从那里开始。

在Rails中,有两个主要因素需要考虑并发性:可以向其 Web 服务器发出的入站客户端请求的数量和数据库连接池的大小。

如果您的连接池大小为 1,则您的应用程序实际上是单线程的:每次发出必须进行数据库查询的入站客户端请求时,该请求都必须从池中检出到数据库的连接。当池大小为 1 且并发入站请求数大于 1 时,第一个请求之后的每个请求都必须暂停,同时第一个请求完成其查询并 returns 连接到池。如果第一个请求需要很长时间才能完成,则后续请求可能会在等待池中的可用连接时超时。

所以从 Rails 方面来说,您希望有一个大小大于 1 的连接池以允许并发。如果你将它的大小设置为 1 那么你如何配置 PgBouncer 并不重要; Rails 将始终最多建立一个到数据库的连接,并且所有线程必须共享该单个连接。

您可以在 ActiveRecord::ConnectionAdapters::ConnectionPool < Object 的 Rails 中阅读有关连接池的更多信息。