为什么我的Ruby程序没有初始化多个数据库连接?

时间:2014-02-04 20:12:00

标签: ruby oop activerecord

我的数据库连接相互覆盖存在问题。

我创建了两个单独的连接,但是当我调用$db1.execute_sql时,$db2.execute_sql实际上是被调用的。

这就是我所拥有的:

servers.yml:

db1:
  adapter: jdbc
  driver: oracle.jdbc.driver.OracleDriver
  url: db_1_url
  username: my_username
  password: m_password

db2:
  adapter: jdbc
  driver: oracle.jdbc.driver.OracleDriver
  url: db_2_url
  username: my_username
  password: m_password

ServerContext类:

class ServerContext
  def initialize (env)
    connect(env)
  end

  def connect(env)
    begin
    config = YAML.load_file("features/config/servers.yml")
    rescue
      puts "cannot load config/servers.yml"
    end
    @connection = ActiveRecord::Base
    @connection.establish_connection(config[env])
  end

  def execute_sql(sql_string)
    @connection.connection.execute(sql_string)
  end

数据库设置:

def connect_databases
  $db1 = ServerContext.new('db1')
  $db2 = ServerContext.new('db2')
end

3 个答案:

答案 0 :(得分:1)

你正在做

@connection = ActiveRecord::Base

我认为当你为连接使用相同的类静态方法两次时,第二次只是重写前一个连接。

为每个连接创建一个从ActiveRecord :: Base扩展的类:

class DB1 < ActiveRecord::Base
  self.abstract_class = true
end

class DB2 < ActiveRecord::Base
  self.abstract_class = true
end

然后,在你的连接方法中:

case config[env]
when 'db1'
  @connection = DB1
when 'db2'
  @connection = DB2
end

答案 1 :(得分:1)

当前连接是一个线程局部变量,因此您一次只能将其设置为一个 - http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html 您需要两个从ActiveRecord :: Base继承的单独类来执行您想要的操作

答案 2 :(得分:0)

因此新的activeRecord将连接存储在基于类名的哈希中。所以每次我在ActiveRecord中覆盖连接(不在类本身中)。请参阅http://api.rubyonrails.org/classes/ActiveRecord/Base.html并查看“连接到不同模型中的多个数据库”。