Rails 多数据库下,能否让每个用户始终保持一个数据库的链接?

kitaro000 · 2015年10月03日 · 最后由 wangyuehong 回复于 2015年10月05日 · 1913 次阅读

我正在做一个后台管理,需要链接多个数据库,比如 A,B,C。到底连哪个是在登录时就选好确定的。后面的操作都基于这个数据库的数据

我可以在登录时这么写

ActiveRecord::Base.establish_connection(:one_db)

后来我发现,只在登录时设置是不行的,因为多个用户同时操作时,我必须在每一个 action 前都判断用户选择的是哪个库。

我或许可以将用户选的 db 参数放进 session,并在 ApplicationController 中写个 before_action, 每次操作都判断并重新执行 establish_connection

但我觉得这不是好办法,大家在实践中是怎么做的呢?

可以理解为是根据 user_id 做了分库(A, B, C)吗? 如果是这样,目前想到的有下面两种做法(各有优缺点)

  1. 添加一个 master 表,保存用户的分库信息 ,并在读取时加层缓存的话处理速度上不会有太大影响
  2. 根据 user_id 做 hash 运算,根据结果选择数据库(最简单的 user_id % 3 )

如果是常见的 multi-tenancy 系统的话,可以参照 apartment的做法,在每个请求里都切换数据连接,直接使用 apartment 会节省很多开发成本。 如果技术选型自己可以控制,而且碰巧数据库用的是 postgresql 的话,最好不要采用多数据库的方式,使用一个数据库多 schema 的方案会更好。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号