【问题标题】:Rails - how can I make a request that doesn't hit the database at all?Rails - 我怎样才能发出一个根本不访问数据库的请求?
【发布时间】:2011-02-08 06:13:38
【问题描述】:

为了跟踪一些性能问题,我正在尝试创建一个通过 Rails (2.3.8) 框架呈现但不调用数据库的页面。

我希望请求通过典型的中间件(routes.rb > 控制器 > 视图),而不是呈现简单的静态页面(如 404.html),并且在关闭数据库服务器时它应该可以工作(网络服务器仍在运行)。实际呈现的页面是一个简单的 html 页面,使用 erb 显示货币时间。现在,当我关闭数据库时出现错误,我可以看到 2 个仍在进行的查询:

SQL (0.1ms)   SET NAMES 'utf8'
SQL (0.1ms)   SET SQL_AUTO_IS_NULL=0

知道如何在发出请求时完全覆盖数据库吗?谢谢。

【问题讨论】:

    标签: mysql ruby-on-rails performance middleware overriding


    【解决方案1】:

    解决它的唯一方法是覆盖 ActiveRecord 中的 configure_connection 函数。为此,我建议创建一个名为 skip_sql 的 ApplicationController 函数?测试是否要跳过某些控制器#action组合的configure_connection函数:

    类应用控制器 定义skip_sql? params[:controller] == "..." && params[:action] == "..." 结尾 结尾

    然后让这个函数对你的类和模型可用:

    模块 SkipSql 模块控制器 def self.included(base) base.prepend_before_filter :assign_skip_sql_to_models 结尾 def assign_skip_sql_to_models ActiveRecord::Base.skip_sql_proc = proc {send(:skip_sql?)} 结尾 结尾 模块型号 def self.included(base) base.extend 类方法 结尾 模块类方法 attr_accessor :skip_sql_proc 定义skip_sql? ActiveRecord::Base.skip_sql_proc.call if ActiveRecord::Base.skip_sql_proc 结尾 结尾 定义skip_sql? self.class.skip_sql? 结尾 结尾 结尾 Object.send :include, SkipSql::Model::ClassMethods ActionController::Base.class_eval {包括 SkipSql::Controller}

    然后只在你设置的controller#action组合上跳过sql:

    类 ActiveRecord::ConnectionAdapters::MysqlAdapter def 配置连接 除非skip_sql? 编码 = @config[:编码] 执行("SET NAMES '#{encoding}'", :skip_logging) 如果编码 执行(“SET SQL_AUTO_IS_NULL=0”,:skip_logging) 结尾 结尾 结尾

    如果 configure_connection 不起作用,我会尝试这样的连接方法:

    类 ActiveRecord::ConnectionAdapters::MysqlAdapter 别名 :old_connect :connect 定义连接 old_connect 除非skip_sql? 结尾 别名:old_active? :积极的? 默认激活? 跳过_sql? ?错误:old_active? 结尾 结尾

    我相信 connect 方法在配置连接方法之前被调用,所以它应该有助于解决套接字问题。

    【讨论】:

    • 哇,谢谢。我试了一下,但是当我关闭数据库服务器并发出该请求时,出现连接错误Can't connect to local MySQL server through socket..。当 db 服务器打开时,我现在得到 skip_logging,其中 SQL 以前在我上面给出的输出中。我会继续玩它,除非你认为我做错了什么。再次感谢!
    • 嘿,试试connect方法吧。我也为此添加了代码。确保它在您的 config/initializers 或 autoload_once_path 中,因为您不想在开发中不断重新加载此代码。
    • 我希望我能再次支持您的回答。我很确定这可以成为一个不错的插件。
    • @pan-thomakos 您的编辑似乎成功了 - 谢谢!
    • 另外,我必须为 MysqlAdapter 的 active? 方法添加一个覆盖,与 connect 完全相同(带有别名和所有)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2012-12-15
    • 2019-09-02
    • 2021-10-29
    • 2022-11-04
    相关资源
    最近更新 更多