Несколько подключений в пуле подключений Sequel - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть приложение Ruby on Rails, где пользователи подключаются к базе данных, отличной от той, которая установлена ​​в config / database.yml.Возможные подключения к базе данных хранятся в таблице в базе данных.Соединение с базой данных устанавливается для каждого запроса путем вызова establish_connection(connection_config) для модели ActiveRecord

. Я попытался сделать что-то подобное с 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. Когда я использовал в консоли Install_sequel_connection, казалось, что создается только одно соединение.Через некоторое время после запуска в работу сервер БД был перегружен из-за слишком большого количества соединений.Что могло вызвать несколько подключений к одной и той же базе данных, если Sequel :: DATABASES является константой?Это проблема многопоточности, так как установившаяся_связь вызывается несколькими запросами одновременно?

1 Ответ

0 голосов
/ 22 февраля 2019

Одна из проблем, с которой вы можете столкнуться, заключается в том, что если group - простой хеш, то group['host'] и group[:host] - это не одно и то же.Возможно, вы захотите изменить database_equal_group?, чтобы учесть это.

Если все базы данных используют одну и ту же схему, вы можете захотеть использовать поддержку шардинга Sequel вместо создания нескольких экземпляров Sequel :: Database.

...