续集连接池中的多个连接

时间:2019-02-22 00:12:22

标签: ruby-on-rails multithreading activerecord sequel

我有一个Ruby on Rails应用程序,其中用户连接到与config / database.yml中设置的数据库不同的数据库。可能的数据库连接存储在数据库的表中。通过在ActiveRecord模型上调用establish_connection(connection_config)来设置每个请求的数据库连接

我尝试使用以下代码对Sequel做类似的事情

  def self.establish_sequel_connection group
    found = Sequel::DATABASES.find { |db| database_equal_group? db, group }
    found || connect_to_group(group)
  end

  def self.connect_to_group(group)
    db = Sequel.connect(
      adapter: 'postgres', host: group['host'], database: group['database'],
      user: group['username'], password: group['password']
    )
    if Rails.env.development?
      db.sql_log_level = :info
      db.loggers.push(Logger.new($stdout))
    end
    db
  end

  def self.database_equal_group?(db, group)
    db[:host] == group[:host] && db[:database] == group[:database]
  end

当我多次使用Sequel.connect时,我看到了多个数据库,并且在PgAdmin 4中看到了多个连接的创建。当我在控制台中使用Establishment_sequel_connection时,似乎只创建了一个连接。将其投入生产后不久,由于连接过多,数据库服务器过载。如果Sequel :: DATABASES为常数,是什么导致与同一个数据库的多个连接?这是一个多线程问题吗,因为同时有多个请求调用了created_sequel_connection?

1 个答案:

答案 0 :(得分:1)

您可能遇到的一个问题是,如果group是普通哈希,那么group['host']group[:host]并不是同一个人。您可能需要修改database_equal_group?来解决这个问题。

如果所有数据库都使用相同的架构,则可能需要研究使用Sequel的分片支持,而不是创建多个Sequel :: Database实例。