Passenger 是否在请求之间重用数据库连接池?
Does Passenger re-use database connection pools between requests?
我们有一个主从 PostgreSQL 数据库。对于应用程序的只读密集部分(报告),我们在 before_action
控制器块中使用 ActiveRecord::Base.establish_connection(:slave)
将请求的查询定向到从站。
昨天转移到这个设置后,我们遇到了一个全新的错误ActiveRecord::StatementInvalid (PG::ReadOnlySqlTransaction: ERROR: cannot execute SELECT FOR UPDATE in a read-only transaction...
这让我们开始思考。我们使用 Phusion Passenger 4.0.45 作为应用程序服务器。同一个 Ruby/Rails 实例是否重复使用 Passenger 的连接池?
换句话说,如果在其中一个实例中 establish_connection(:slave)
被调用,同一个实例是否有可能服务于另一个未明确调用 establish_connection(:slave)
的请求,但仍然使用从属因为连接池重用或某种其他形式的数据库连接缓存?
有没有办法避免这种情况?
是的,Rails 进程重用同一进程内实例化的连接。这是 Rails 功能,而不是 Passenger 功能。有关详细信息,请参阅 ActiveRecord::ConnectionAdapters::ConnectionPool。
为了解决这个问题,尝试使用像octopus这样的主从数据库gem。
我们有一个主从 PostgreSQL 数据库。对于应用程序的只读密集部分(报告),我们在 before_action
控制器块中使用 ActiveRecord::Base.establish_connection(:slave)
将请求的查询定向到从站。
昨天转移到这个设置后,我们遇到了一个全新的错误ActiveRecord::StatementInvalid (PG::ReadOnlySqlTransaction: ERROR: cannot execute SELECT FOR UPDATE in a read-only transaction...
这让我们开始思考。我们使用 Phusion Passenger 4.0.45 作为应用程序服务器。同一个 Ruby/Rails 实例是否重复使用 Passenger 的连接池?
换句话说,如果在其中一个实例中 establish_connection(:slave)
被调用,同一个实例是否有可能服务于另一个未明确调用 establish_connection(:slave)
的请求,但仍然使用从属因为连接池重用或某种其他形式的数据库连接缓存?
有没有办法避免这种情况?
是的,Rails 进程重用同一进程内实例化的连接。这是 Rails 功能,而不是 Passenger 功能。有关详细信息,请参阅 ActiveRecord::ConnectionAdapters::ConnectionPool。
为了解决这个问题,尝试使用像octopus这样的主从数据库gem。