2008-01-11
Cache SHOW COLUMNS
关键字: cache columns
今天recity发布第二版本,优化了半天,终于达到一个稍微满意的速度,闲下来也写了篇bllog轻松下:)
这个东西据说在production已经cache了,是的,确实是的!
今天主要的目的是折腾
于是乎google一把,看有没有现成的plugin,呵呵,俺想偷懒 :D
没找到plugins,但是找到一个不错的patch:http://dev.rubyonrails.org/attachment/ticket/9046/cache_column_names.patch
哦,原来就是这么个东西,开始动手,把它转换成plugins
先说明下,这个只是初步入门级别,没什么深入研究的可是为什么要写这篇文章:
呵呵,纯属折腾。。。
新建一个plugin
将cache_column_name.patch的代码稍作修改填到我们的lib/cache_columns里去
这里面的columns和reset_column_information是实类方法,所以我们可以使用
来覆盖原始的method
首先请先备份原始的两个method
新建一个全局的变量Hash来缓存columns
OK,include 到ActiveRecord::Base里去
打完收工
完整代码如下:
/vendor/plugins/cache_columns/init.rb
/vendor/plugins/cache_columns/lib/cache_columns.rb
代码我放到code.google.com上面去了
哦,你想缓存到memcached中?好吧,我们再继续修改之,有过一次经历,这次再动手就简单多了。
这个东西据说在production已经cache了,是的,确实是的!
今天主要的目的是折腾
没找到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
- 16:57
- 浏览 (428)
- 评论 (5)
- 分类: Ruby&Rails
- 进入论坛
- 相关推荐
评论
xxj
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的效率,才会把日志分析看看。
+
http://nubyonrails.com/articles/a-hodel-3000-compliant-logger-for-the-rest-of-us
其实这个东西我基本不用,偶尔需要查看看Controller的效率,才会把日志分析看看。
lgn21st
2008-01-14
hodel_3000_compliant_logger
pl_analyzer
这两个东西都没有接触过,正在google中
能介绍一下么?
pl_analyzer
这两个东西都没有接触过,正在google中
能介绍一下么?
xxj
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
所以能看到的.
lgn21st
2008-01-11
在production环境下,SQL语句默认不会output吧,莫非被人为打开了?
Readonly
2008-01-11
引用
这个东西据说在production已经cache了,但是我从log分析来看
难道你在production log下有发现SHOW COLUMNS的语句不断被打出?
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 103321 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
我的相册
2008-6-24 8-00-01.png
共 59 张
共 59 张
最近加入圈子
最新评论
-
无聊,无题
那么多数字无聊进去的……
-- by mmiwwcom -
无聊,无题
身份证号码?
-- by mmiwwcom -
Code Review&JRuby on Rai ...
我悄悄的看看
-- by mmiwwcom -
DM & Merb 快速体验
尝试安装的时候发现DM无法在win32的平台上通过gem安装?
-- by yy77 -
DM & Merb 快速体验
Raecoo 写道Merb的精简,是要看以什么样的角度去看待了 Merb的目标 ...
-- by neodoxy






评论排行榜