使用 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 中阅读有关连接池的更多信息。
我可以在 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 中阅读有关连接池的更多信息。