【问题标题】:Multiple connections in a Sequel Connection poolSequel Connection 池中的多个连接
【发布时间】:2019-02-22 00:12:22
【问题描述】:

我有一个 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 中创建了多个连接。当我在控制台中使用建立序列连接时,看起来只创建了一个连接。将其推送到生产后不久,由于连接过多,数据库服务器超载。如果 Sequel::DATABASES 是一个常量,什么会导致到同一个数据库的多个连接?是不是因为多个请求同时调用了substrate_sequel_connection,是多线程的问题?

【问题讨论】:

    标签: ruby-on-rails ruby multithreading activerecord sequel


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      相关资源
      最近更新 更多