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方法,因此它应该有助于解决套接字问题.