Rails - 如何创建一个完全没有命中数据库的请求?

sa1*_*125 10 mysql performance overriding middleware ruby-on-rails

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

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

SQL (0.1ms)   SET NAMES 'utf8'
SQL (0.1ms)   SET SQL_AUTO_IS_NULL=0
Run Code Online (Sandbox Code Playgroud)

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

Pan*_*kos 13

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

class ApplicationController
  def skip_sql?
    params[:controller] == "..." && params[:action] == "..."
  end
end

然后将此功能提供给您的类和模型:

module SkipSql
  module Controller
    def self.included(base)
      base.prepend_before_filter :assign_skip_sql_to_models
    end

    def assign_skip_sql_to_models
      ActiveRecord::Base.skip_sql_proc = proc {send(:skip_sql?)}
    end
  end
  module Model
    def self.included(base)
      base.extend ClassMethods
    end

    module ClassMethods
      attr_accessor :skip_sql_proc

      def skip_sql?
        ActiveRecord::Base.skip_sql_proc.call if ActiveRecord::Base.skip_sql_proc
      end

    end

    def skip_sql?
      self.class.skip_sql?
    end
  end
end

Object.send :include, SkipSql::Model::ClassMethods
ActionController::Base.class_eval {include SkipSql::Controller}

然后只在你设置的控制器#动作组合上跳过sql:

class ActiveRecord::ConnectionAdapters::MysqlAdapter
  def configure_connection
    unless skip_sql?
      encoding = @config[:encoding]
      execute("SET NAMES '#{encoding}'", :skip_logging) if encoding

      execute("SET SQL_AUTO_IS_NULL=0", :skip_logging)
    end
  end
end

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

class ActiveRecord::ConnectionAdapters::MysqlAdapter
  alias :old_connect :connect

  def connect
    old_connect unless skip_sql?
  end

  alias :old_active? :active?

  def active?
    skip_sql? ? false : old_active?
  end
end

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