如何为 rails 5 应用程序配置模式缓存?



所以,我目前正在一个项目中使用 Rails 5 和 mysql db。我正在尝试使用ActiveRecord架构缓存在我的rails应用程序上快速加载表,而无需查询show full fields。默认情况下启用此选项,要使其工作,您唯一需要做的就是使用 rake db:schema:cache:dump(它将在 db 文件夹中生成缓存文件(。虽然,我一直看到show full fields查询是通过newrelic触发的,并决定运行一些测试来评估缓存是否正常工作。

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

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

这是我的自定义初始值设定项(改编自这里(:

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

如上所示,连接对象与初始化和控制台本身不同,服务器也会发生同样的情况。因此,来自connectionschema_cache是空的。

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

我找到了解决方案。彪马是罪魁祸首,而不是Rails。在彪马分叉一个工作线程后,ActiveRecord 连接丢失了。

描述问题的问题

Rails 上的拉取请求指出不再需要 puma 配置

最新更新