ruby-on-rails - 更改连接 search_paths 的线程安全方式

标签 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 或 gem 进行一些我无法控制的更改)

所有这些尤其适用于线程服务器,例如 Puma。

那么,对于我的带有中间件的解决方案,是否有更好的替代方案?

谢谢。

最佳答案

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

这将清除所有SET ROLESET SESSION AUTHORIZATION、 session 变量、search_path 设置等。

关于ruby-on-rails - 更改连接 search_paths 的线程安全方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21746181/

相关文章:

mysql - rails : Does every http request creates a new connection pool?

iphone - 关于服务器/客户端结构 iOS App 开发的服务器实现的建议?

postgresql - Postgres 用于截断外键标识符的特定算法是什么?

javascript - 使用输入中的值并将其设置为 URL

ruby-on-rails - has_many :through Association - Modification?

ruby-on-rails - sort_by 上 nil 对象的 NoMethodError,并且所有对象都存在

ruby-on-rails - 使用 Ruby on Rails 3 显示 'size' 的 'file_field' 属性时出现问题

java - 导入(合并)-导出java db数据库的最佳方法

Postgresql plpgsql函数语法错误

sql - 将纪元转换为时间戳时获取不正确的日期