使用ActiveRecord连接多个数据库

3

我有这样一个情况,我的应用需要按需连接到数据库。数据库的数据模型是相同的,但我需要并行地连接到不同的数据库。例如,我的RESTful路由可能如下所示:

/database/:database_id/user/:user_id # Get user :user_id from database :database_id

我看过类似的问题,它们都建议使用 ActiveRecord::Base#establish_connection。然而,这些问题似乎没有处理同时访问多个数据库并使用相同模型类的情况。我的担心是,我会得到一个请求,建立一条连接,开始从数据库中读取,但随后有一个新请求进来,并改变 ActiveRecord 的连接。这是一个合理的担忧吗? 我正在使用 Ruby 1.8.7 和 Rails 3.0 运行此代码。
谢谢。 - Max
2个回答

4
所以,我面临着一个类似的问题,需要连接有些动态。建议不要使用ActiveRecord,而是直接使用db驱动程序。在我的情况下,它是一个遗留数据库,我不需要记录变成一个对象,我可以操作和保存回数据库,这更多是为了报告目的 - 我只需要聚合查询的结果(仅选择)。
对于这种情况,只需使用MySQL2 gem 就很好了。这种方法允许Rails对应用程序中的某些内容进行规范化处理(我需要ORM),但同时也灵活地避免了AR,当我真正需要连接到任意DB来获取一些快速数据时。
所以,这里有一些你需要问自己的问题:
  • 我需要ORM类似的功能将数据库行映射到对象吗?我需要CRUD操作吗?
  • 我需要持久连接,还是当请求完成后断开数据库连接就可以了?
    • (当然,如果需要的话,你可以自己创建连接池和持久连接)

如果你不需要具备CRUD操作的ORM功能,并且只需要一些简单的操作,而且你不需要持久连接,我建议你只使用适用于你的数据库的DB驱动程序。

希望对你有所帮助。


我只会从数据库中读取数据,但使用一些Active Record提供的关系特性会非常方便,因为数据高度相关。此外,你还可以获得免费的JSON序列化,这正是我所需要的。明天我开始实现这些内容后会发布更新。感谢你的出色回答。 - Max

1
在Rails 6中,您可以使用多个数据库功能:
class ShardRecord < ActiveRecord::Base
  self.abstract_class = true

  connects_to shards: {
    club_1: { writing: :club_1, reading: :club_1 },
    club_2: { writing: :club_2, reading: :club_2 }
  }
end

class ApplicationController < ActionController::API
  before_action :set_club
  around_action :connect_to_shard

  private

  def set_club
    @club = SelectClubByDomain.new(request).slug
  end

  def connect_to_shard
    ActiveRecord::Base.connected_to(role: :writing, shard: @club.slug) do
      yield
    end
  end
end

来源:

https://guides.rubyonrails.org/active_record_multiple_databases.html https://www.freshworks.com/horizontal-sharding-in-a-multi-tenant-app-with-rails-61-blog/ https://api.rubyonrails.org/classes/ActiveRecord/ConnectionHandling.html#method-i-connected_to_many


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接