我有一个适用于主要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工作正常(但没有正确的配置对象)。
我在这做什么?
而且,这些是用来解决我的问题的正确方法吗?
答案 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
)时,都会创建一个新池。否则将是荒谬的!
答案 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配置。