如何使用Ruby on Rails创建新的ActiveRecord连接池?

时间:2014-03-27 06:28:32

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

我有一个适用于主要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。 Interstingly ActiveRecord :: ConnectionAdapters :: ConnectionPool工作正常(但没有正确的配置对象)。

我在这做什么?

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

2 个答案:

答案 0 :(得分:3)

根据您的使用情况,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

答案 1 :(得分:0)

我在初始化程序中只有一个单独的文件,用于创建多个连接。 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配置。