【问题标题】:Rails 6 while running sidekiq database configuration does not specify adapterRails 6在运行sidekiq数据库配置时未指定适配器
【发布时间】:2021-02-28 23:03:58
【问题描述】:

最近我们开始将代码库从 rails 5 迁移到 rails 6。除了 sidekiq 之外,一切似乎都运行良好。每当我们尝试在生产模式下运行 sidekiq 时,它总是会抛出一个错误数据库配置未指定适配器。我很确定我们在 database.yml 中提到了一个适配器。有人可以帮忙解决这个问题吗?

供参考

导轨 6.0.3.4

Sidekiq 6.1.2

Ruby 2.7.1p83

databsae.yml 文件

default: &default
  adapter: postgresql
  pool: <%= ENV['DATABASE_POOL'] %>
  timeout: 5000
  database: anajmandi
  
development:
  primary:
    <<: *default
    url: <%= ENV['DATABASE_URL'] %>
    multidb:
      fallback: true
  follower: 
    <<: *default
    url: <%= ENV['DATABASE_SLAVE_URL'] %>
    replica: true
    multidb:
      fallback: true

test:
  <<: *default
  database: db/test.sqlite3

production:
  primary:
    <<: *default
    url: <%= ENV['DATABASE_URL'] %>
    multidb:
      fallback: true
  follower: 
    <<: *default
    url: <%= ENV['DATABASE_SLAVE_URL'] %>
    replica: true
    multidb:
      fallback: true

和sidekiq.rb文件

# typed: strict
if Rails.env.production?
  # three unicorns = 3 connections
  Sidekiq.configure_client do |config|
    config.redis = { :size => 1 }
  end

  Sidekiq.configure_server do |config|
    config.redis = { url: ENV['REDIS_URL'], size: 22 }

    Rails.application.config.after_initialize do
      Rails.logger.info("DB Connection Pool size for Sidekiq Server before disconnect is: #{ActiveRecord::Base.connection.pool.instance_variable_get('@size')}")
      ActiveRecord::Base.connection_pool.disconnect!

      ActiveSupport.on_load(:active_record) do
        config = Rails.application.config.database_configuration[Rails.env]
        config['reaping_frequency'] = ENV['DATABASE_REAP_FREQ'] || 10 # seconds
        config['pool'] = ENV['WORKER_DB_POOL_SIZE'] || Sidekiq.options[:concurrency]
        ActiveRecord::Base.establish_connection(config)

        Rails.logger.info("DB Connection Pool size for Sidekiq Server is now: #{ActiveRecord::Base.connection.pool.instance_variable_get('@size')}")
      end
    end
  end

end

这是运行命令bundle exec sidekiq -e production -C config/sidekiq.yml时的错误堆栈跟踪

DB Connection Pool size for Sidekiq Server before disconnect is: 5
database configuration does not specify adapter
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activerecord-6.0.3.4/lib/active_record/connection_adapters/connection_specification.rb:161:in `spec'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activerecord-6.0.3.4/lib/active_record/connection_adapters/abstract/connection_pool.rb:1052:in `establish_connection'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activerecord-6.0.3.4/lib/active_record/connection_handling.rb:51:in `establish_connection'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activerecord-import-1.0.6/lib/activerecord-import/import.rb:250:in `establish_connection'
/Users/yadusingla/spars/procol-backend/config/initializers/sidekiq.rb:19:in `block (3 levels) in <top (required)>'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:71:in `class_eval'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:71:in `block in execute_hook'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:61:in `with_execution_control'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:66:in `execute_hook'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:43:in `block in on_load'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:42:in `each'
/Users/yadusingla/.rvm/gems/ruby-2.7.1/gems/activesupport-6.0.3.4/lib/active_support/lazy_load_hooks.rb:42:in `on_load'

【问题讨论】:

  • 您是否设置了ENV['REDIS_URL'] 环境变量?
  • 是的,所有的ENV变量都设置好了。

标签: ruby-on-rails ruby activerecord rubygems sidekiq


【解决方案1】:

这里我使用的是 3 层配置,因此 3 层配置初始化程序没有正确定义。如果我们通过环境变量选择配置,那么我们将得到两个,主要和从属。 Rails 不知道要访问哪一个,因此应用程序必须选择正确的。

config = Rails.application.config.database_configuration[Rails.env]更改为

self.configurations = Rails.application.config.database_configuration

config = configurations.configs_for(env_name: Rails.env, spec_name: "primary").config

参考此链接https://github.com/rails/rails/issues/40640

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    相关资源
    最近更新 更多