如何在Rails中与多个数据库并行建立连接?

Art*_*dad 7 mysql database activerecord connection-pooling ruby-on-rails

上下文

我正在构建一个SaaS,用户可以在其中创建自己的网站(如Wix或SquareSpace).这就是幕后发生的事情:

  • 我的应用程序有其主存储用户的数据库
  • 当用户创建他的网站时,会创建一个外部数据库来存储其数据
  • SQL文件在此外部数据库中运行以设置默认设置
  • 其他用户应同时创建其网站

途径

创建新数据库建立连接,请执行以下操作:

ActiveRecord::Base.connection.execute("CREATE DATABASE #{name}")
ActiveRecord::Base.establish_connection(<dynamic db data>)
Run Code Online (Sandbox Code Playgroud)

然后我通过执行以下操作在db中执行sql代码:

sql = File.read(sql_file.sql)
statements = sql.split(/;$/)
statements.pop
ActiveRecord::Base.transaction do
  statements.each do |statement|
    connection.execute(statement)
  end
end
Run Code Online (Sandbox Code Playgroud)

然后我重新建立与主db的连接:

ActiveRecord::Base.establish_connection :production
Run Code Online (Sandbox Code Playgroud)

问题

  1. 建立与动态数据库的连接使应用程序的主数据库暂时无法使用:
    • 用户A正在创建一个网站(建立动态数据库连接)
    • 用户B尝试访问其用户区域(需要应用程序的主数据库数据)
    • 应用程序抛出错误,因为它尝试检索app-main-db的数据(此时未建立连接)

如何在没有数据库冲突的情况下同时处理许多用户创建网站?

换句话说,如何establish_connection并行使用多个数据库?


注意:它与通过database.yml连接到多个数据库不同.这里的目标是同时连接和断开多个用户对动态创建的数据库的连接.

Zzz*_*Zzz 1

这颗宝石可能会有所帮助。但是,您可能需要重命名某些模型以使用外部数据库命名空间而不是ApplicationRecord

https://github.com/ankane/multiverse