浏览 2749 次
锁定老帖子 主题:Cache SHOW COLUMNS
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-01-11
这个东西据说在production已经cache了,是的,确实是的! 今天主要的目的是折腾 于是乎google一把,看有没有现成的plugin,呵呵,俺想偷懒 没找到plugins,但是找到一个不错的patch:http://dev.rubyonrails.org/attachment/ticket/9046/cache_column_names.patch 哦,原来就是这么个东西,开始动手,把它转换成plugins 先说明下,这个只是初步入门级别,没什么深入研究的可是为什么要写这篇文章: 呵呵,纯属折腾。。。 新建一个plugin ruby script/generate plugin CacheColumns 将cache_column_name.patch的代码稍作修改填到我们的lib/cache_columns里去 这里面的columns和reset_column_information是实类方法,所以我们可以使用 base.instance_eval do block goes here end 来覆盖原始的method 首先请先备份原始的两个method alias old_columns columns alias old_reset_column_information reset_column_information 新建一个全局的变量Hash来缓存columns @@columns = {} OK,include 到ActiveRecord::Base里去 ActiveRecord::Base.send :include, CacheColumns::ActiveRecord 打完收工 完整代码如下: /vendor/plugins/cache_columns/init.rb ActiveRecord::Base.send :include, CacheColumns::ActiveRecord /vendor/plugins/cache_columns/lib/cache_columns.rb module CacheColumns module ActiveRecord @@columns = {} def self.included(base) base.instance_eval do alias old_columns columns alias old_reset_column_information reset_column_information def columns if @@columns[table_name].nil? @@columns[table_name] = connection.columns(table_name, "#{name} Columns") @@columns[table_name].each {|column| column.primary = column.name == primary_key} end @@columns[table_name] end # # Resets all the cached information about columns, which will cause them to be reloaded on the next request. def reset_column_information generated_methods.each { |name| undef_method(name) } @column_names = @columns_hash = @content_columns = @dynamic_methods_hash = @read_methods = @inheritance_column = nil @@columns.delete(table_name) end def reset_column_cache #:nodoc: @@columns = {} end end end end 代码我放到code.google.com上面去了 svn co http://cache-columns.googlecode.com/svn/trunk 哦,你想缓存到memcached中?好吧,我们再继续修改之,有过一次经历,这次再动手就简单多了。 require 'memcache_util' module CacheColumns module ActiveRecord def self.included(base) base.instance_eval do alias old_columns columns alias old_reset_column_information reset_column_information @ttl = 60 * 30 #增加个配置选择? def columns record = get_columns(table_name) unless record record = connection.columns(table_name, "#{name} Columns") record.each {|column| column.primary = column.name == primary_key} cache_store record end record end # # Resets all the cached information about columns, which will cause them to be reloaded on the next request. def reset_column_information generated_methods.each { |name| undef_method(name) } @column_names = @columns_hash = @content_columns = @dynamic_methods_hash = @read_methods = @inheritance_column = nil cache_delete end #get columns from memcached def get_columns(name) start_time = Time.now record = Cache.get cache_key_memcache elapsed = Time.now - start_time ActiveRecord::Base.logger.debug('CacheColumns Get (%0.6f) %s' % [elapsed, cache_key_memcache]) record end #store columns def cache_store(record) start_time = Time.now Cache.put cache_key_memcache, record, @ttl elapsed = Time.now - start_time ActiveRecord::Base.logger.debug('CacheColumns Set (%0.6f) %s' % [elapsed, cache_key_memcache]) record end def cache_key_memcache "active_record:columns:#{table_name}" end def cache_delete Cache.delete cache_key_memcache end end end end end 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-01-11
引用 这个东西据说在production已经cache了,但是我从log分析来看
难道你在production log下有发现SHOW COLUMNS的语句不断被打出? |
|
返回顶楼 | |
发表时间:2008-01-11
在production环境下,SQL语句默认不会output吧,莫非被人为打开了?
|
|
返回顶楼 | |
发表时间:2008-01-14
不是的,我用了hodel_3000_compliant_logger,便于用pl_analyzer分析日志用。
require 'logger' require 'English' # Jan 2 03:38:05 topfunky postfix/postqueue[2947]: warning blah blah blah ## # A logger for use with pl_analyze and other tools that expect syslog-style log output. class Hodel3000CompliantLogger < Logger ## # Note: If you are using FastCGI you may need to hard-code the hostname here instead of using Socket.gethostname def format_message(severity, timestamp, msg, progname) "#{timestamp.strftime("%b %d %H:%M:%S")} #{Socket.gethostname.split('.').first} rails[#{$PID}]: #{progname.gsub(/\n/, '').lstrip}\n" end end 所以能看到的. |
|
返回顶楼 | |
发表时间:2008-01-14
hodel_3000_compliant_logger
pl_analyzer 这两个东西都没有接触过,正在google中 能介绍一下么? |
|
返回顶楼 | |
发表时间:2008-01-14
http://rails-analyzer.rubyforge.org/pl_analyze/
+ http://nubyonrails.com/articles/a-hodel-3000-compliant-logger-for-the-rest-of-us 其实这个东西我基本不用,偶尔需要查看看Controller的效率,才会把日志分析看看。 |
|
返回顶楼 | |