我有一个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可能会自动为您完成此操作。每个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
上的任何子类)它创建一个新的池。否则将是荒谬的!
一个可能对建立连接有帮助的SO帖子
我只是在我的初始化器中有一个单独的文件,我用来创建多个连接。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和models中,只需包含此文件并传递数据库类型。确保数据库。Yml具有所需的配置。模型将类似于:
class Bar < ActiveRecord::Base
include whateverName
base :oracle
end