我希望能够在 Rails 4 应用程序中的不同数据库架构之间切换。
计划是在堆栈的最开始添加一个新的中间件来为我做这件事。
唯一的方法是设置 ActiveRecord::Base.connection.schema_search_path = '"$user",my_schema'
。
我遇到的问题是此连接将转到池中,并且所有后续请求都将使用在第一个请求中设置的架构(基本上是通过泄漏)。
所以我看到的解决方案是始终将搜索路径重置为之前的内容,并始终在每次请求时进行设置。
但我不想这样做,因为:
- 99% 的请求将转到默认的 (
public
) 模式,执行set search_path to '$user$,my_schema'
将是额外的查询,可能有被回避了 - 更高的泄漏风险(其他中间件可能会更早建立连接,或者对 Rails 或 gem 进行一些我无法控制的更改)
所有这些尤其适用于线程服务器,例如 Puma。
那么,对于我的带有中间件的解决方案,是否有更好的替代方案?
谢谢。
最佳答案
当您将连接返回到池中时,您必须确保池运行 DISCARD ALL;
以重置连接状态。
这将清除所有SET ROLE
、SET SESSION AUTHORIZATION
、 session 变量、search_path
设置等。
关于ruby-on-rails - 更改连接 search_paths 的线程安全方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21746181/