线程安全的方式更改连接search_paths

时间:2014-02-13 05:44:50

标签: ruby-on-rails database postgresql connection database-schema

我希望能够在Rails 4应用程序中的不同数据库模式之间切换。

计划是在堆栈的最开头添加一个新的中间件来为我做这件事。

唯一的方法是设置ActiveRecord::Base.connection.schema_search_path = '"$user",my_schema'

我遇到的问题是此连接将转到池中,并且以下所有请求都将使用第一个中设置的架构(基本上将其泄漏)。

所以我看到的解决方案是始终将搜索路径重置为之前的状态,并始终在每个请求上设置它。

但我不想这样做是因为:

  • 99%的请求将转到默认(public)架构,执行set search_path to '$user$,my_schema'将是可以避免的其他查询
  • 泄漏的风险较高(其他中间件可能会提前建立连接,或者对我无法控制的Rails或宝石进行一些更改)

所有这些特别适用于线程服务器,如Puma。

对于我的中间件解决方案,还有更好的替代方案吗?

感谢。

1 个答案:

答案 0 :(得分:2)

当您返回到池的连接时,必须确保池运行DISCARD ALL;以重置连接状态。

这将清除所有SET ROLESET SESSION AUTHORIZATION,会话变量,search_path设置等。