【问题标题】:Why does my Ruby program not initialize multiple database connections?为什么我的 Ruby 程序没有初始化多个数据库连接?
【发布时间】:2014-02-04 20:12:00
【问题描述】:

我的数据库连接相互覆盖时遇到问题。

我创建了两个单独的连接,但是当我调用 $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

【问题讨论】:

    标签: ruby oop activerecord


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你在做

      @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
      

      【讨论】:

      • 即使我为每个数据库连接都实例化一个新版本的 ServerContext 也是这种情况吗?
      • 是的,它在班级级别。您还需要调用 DB1.establish_connection 和 DB2.establish_connection
      【解决方案3】:

      因此,新的 activeRecord 将连接存储在基于类名称的哈希中。所以每次我在 ActiveRecord 中覆盖连接(而不是在类本身中)。请参阅 http://api.rubyonrails.org/classes/ActiveRecord/Base.html 并在 Connection to multiple databases in different models 下查看。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-06
        • 1970-01-01
        • 2020-10-09
        • 2016-09-29
        相关资源
        最近更新 更多