【问题标题】:How to create a new ActiveRecord Connection Pool with Ruby on Rails?如何使用 Ruby on Rails 创建新的 ActiveRecord 连接池?
【发布时间】:2014-03-27 06:28:32
【问题描述】:

我有一个 RoR 应用,可以很好地与主 RoR 数据库配合使用。我还想以一种不会为每个新的 HTTP 请求重新创建数据库连接的方式连接到任意数据库。根据我的研究,连接池似乎是可行的方法。

但是,我无法弄清楚如何创建池本身:

config = ActiveRecord::ConnectionAdapters::ConnectionSpecification.new( {
          "adapter"  => "postgresql",
          "host"     => "localhost",
          "port"     => 9000,
          "database" => "foo_test",
          "username" => "foo",
          "password" => "bar",
          "pool"     => "5",
          "timeout"  => "3000"
        })

my_connection_pool = ActiveRecord::ConnectionAdapters::ConnectionPool.new(config)

NameError 出现此错误:未初始化常量 ActiveRecord::ConnectionAdapters::ConnectionSpecification。有趣的是 ActiveRecord::ConnectionAdapters::ConnectionPool 工作正常(但没有正确的配置对象)。

我在这里做什么?

而且,这些是用来解决我的问题的正确方法吗?

【问题讨论】:

  • 首先:我真的不知道......但我想知道你从哪里得到上面的代码以及你是否有rails版本不匹配......更高版本的rails经常做类似的事情移动或重命名类结构。
  • 所以...在上面的标签中,您指定了 Rails 版本 3,而您刚刚链接到的 doco 适用于 Rails 版本 4。
  • 好点。我会看看这是否重要。我现在在 Rails 3 上。
  • 是的 - 我刚刚检查过...... Rails 3 中不存在该类

标签: ruby-on-rails ruby database ruby-on-rails-3 activerecord


【解决方案1】:

根据您的用例,Rails 可能会自动为您执行此操作。每个ActiveRecord::Base 子类查找继承链找到它的池,所以

class Foo < ActiveRecord::Base
end

使用ActiveRecord::Base连接池,但是

class Bar < ActiveRecord::Base
  establish_connection database: 'some_other_db'
end

class BarSub < Bar
end

都将使用Bar 池连接到“some_other_db”。

我不记得确切,但我认为每次您使用ActiveRecord::Base.establish_connection(或任何子类上的establish_connection)都会创建一个新池。否则将是荒谬的!

A possibly helpful SO post on establish_connection

【讨论】:

  • 我会用这个方案修改ConnectionPool类,在连接初始化后设置事务隔离。谢谢:)
【解决方案2】:

我的初始化程序中只有一个单独的文件,用于创建多个连接。 lib文件是:

require 'active_record'

module whateverName

  def self.included(klass)
    klass.extend(ClassMethods)
  end

  module ClassMethods
    def base(dbName)
      establish_connection(ActiveRecord::Base.configurations[dbName.to_s][Rails.env])
    end
  end

end

将该文件保存在 lib 和模型中,只需包含此文件并传递数据库类型。确保 database.yml 具有所需的配置。模型将类似于:

class Bar < ActiveRecord::Base
  include whateverName
  base :oracle
end

您只需要在 database.yml 中配置 oracle。

【讨论】:

    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 2017-08-07
    • 2016-02-23
    • 2015-12-21
    相关资源
    最近更新 更多