【问题标题】:How to configure schema cache for rails 5 app?如何为 Rails 5 应用程序配置模式缓存?
【发布时间】:2020-09-04 20:00:59
【问题描述】:

所以,我目前在一个项目中使用 Rails 5 和 mysql 数据库。我正在尝试使用 ActiveRecord Schema Cache 在我的 rails 应用程序上预先加载表,而无需查询show full fields。这个选项是enabled by default,要让它工作,你唯一需要做的就是使用 rake db:schema:cache:dump (它将在 db 文件夹中生成缓存文件)。虽然,我一直看到 show full fields 查询是通过 newrelic 触发的,并决定运行一些测试来评估缓存是否正常工作。

经过几次测试后,我表示缓存确实无法正常工作,并且不知道发生了什么。我尝试在配置中将active_record.use_schema_cache_dump 选项设置为true,并确保架构缓存文件存在于应用程序文件夹中。之后,我决定在我的应用程序中手动初始化缓存并使用binding.pry 来查看它的运行情况。有趣的是,缓存已加载并且连接已在没有查询上下文的情况下建立,但是当我离开 pry 并且服务器启动时,缓存被卸载了。

我注意到另一个奇怪的事情,问题不是缓存已被清理,而是 ActiveRecord 使用的连接在两个步骤中都是不同的对象。

这是我的自定义初始化程序(改编自 here):

ActiveSupport.on_load(:active_record) do
  filename = File.join(Rails.application.config.paths["db"].first, "schema_cache.yml")

  if File.file?(filename)
    current_version = ActiveRecord::Migrator.current_version

    next if current_version.nil?

    cache = YAML.load(File.read(filename))
    if cache.version == current_version
      ActiveRecord::Base.connection.schema_cache = cache
      ActiveRecord::Base.connection_pool.schema_cache = cache.dup
      binding.pry
    else
      warn "Ignoring db/schema_cache.yml because it has expired. The current schema version is #{current_version}, but the one in the cache is #{cache.version}."
    end
  end
end

在我使用的控制台上:

[1] pry(ActiveRecord::Base)> ActiveRecord::Base.connection.object_id
=> 70357693731960

Running via Spring preloader in process 21185
Loading development environment (Rails 5.2.2.1)

Frame number: 0/25
[1] pry(main)> ActiveRecord::Base.connection.object_id
(4.3ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
=> 70357724355600

如上所示,连接对象与初始化和控制台本身不同,服务器也是如此。因此,connection 中的 schema_cache 为空。

谁能向我澄清我的假设有什么问题或指出正确的方向来执行架构缓存?

【问题讨论】:

    标签: ruby-on-rails activerecord schema


    【解决方案1】:

    我找到了解决方案。 Puma 是罪魁祸首,而不是 Rails。在 puma fork a worker 后 ActiveRecord 连接丢失。

    Issue describing the problem

    Pull request on Rails stating that the puma configuration was no longer necessary

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-06
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 2015-06-26
      相关资源
      最近更新 更多