今天recity发布第二版本,优化了半天,终于达到一个稍微满意的速度,闲下来也写了篇bllog轻松下:)
这个东西据说在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
分享到:
- 2008-01-11 16:57
- 浏览 1850
- 评论(5)
- 论坛回复 / 浏览 (5 / 2752)
- 查看更多
相关推荐
`showColumns` 参数设置为 `true` 使得用户可以通过下拉菜单选择显示或隐藏列。这个功能在需要根据用户需求定制视图时非常有用。`queryParams` 可以用于自定义发送到服务器的数据,`sidePagination` 设置为 'server'...
例如,`data-toolbar` 用于指定工具栏的位置,`data-show-columns` 和 `data-show-columns-toggle-all` 控制列显示的开关。 ```html <!-- 表格 --> data-toolbar="#toolbar" data-show-columns="true" data-...
4. `cache`, `height`, `showExport`, `exportDataType`, `pagination`, `pageSize`, `pageList`, `search`, `searchAlign`, `showRefresh`, `showToggle`, `showColumns`, `toolbarAlign`, `toolbar`, `...
`SHOW PARAMETER cache_size`显示相关参数,`SELECT * FROM v$parameter WHERE parameter like '%cache_size%'`查找所有与缓存相关的参数,`SELECT * FROM v$sgastat WHERE name='buffer cache'`或`SELECT * FROM v$...
- DNS Cache for fast hostname resolution - Log XNS activity to file / Log Manager - Feature-Centric customizable toolbar - ViewBar & System Tray Access - Remote Access thru X-NetStat Web Server - ...
9. **获取触发器、过程、函数的创建脚本**:使用`SHOW CREATE TRIGGER`, `SHOW CREATE PROCEDURE` 和 `SHOW CREATE FUNCTION`(根据数据库版本不同,可能需要使用其他SQL语句)。 10. **计算表占用空间**:查询`DBA...
本文实例为大家分享了bootstrap table操作的相关... data-height="800" data-show-columns="true" data-smart-display = "true" data-async = false data-query-params="bh_agt_queryParams" data-search="true" d
- `showColumns`: 是否显示列选择框。 - `showRefresh`: 是否显示刷新按钮。 - `idField`: 定义主键字段,用于标识每一行。 - `clickToSelect`: 是否点击行时选中对应的复选框。 - `singleSelect`: 是否只允许选择一...
showColumns:true, pagination:true, minimumCountColumns:2, pageNumber:1, //初始化加载第一页,默认第一页 pageSize: 10, //每页的记录行数(*) pageList: [10, 15, 20, 25], //可供选择的每页的行数(*)...
2. **ORACLE9IAS Web Cache**:Web Cache是一个缓存服务器,用于提高Web应用的性能。初始默认用户和密码为`administrator/administrator`。 3. **创建数据库**:Oracle 8.0.5使用`orainst`工具,8.1.7使用`dbassist...
11. **查看最大会话数**:使用`SELECT * FROM V$PARAMETER WHERE NAME LIKE 'proc%'`或`SHOW PARAMETER processes`来查看当前的进程参数设置。 以上内容涵盖了Oracle数据库的基本操作和管理,包括用户管理、数据库...
13. **查看最大会话数**:通过查询`V$PARAMETER`视图或执行`SHOW PARAMETER processes`来查看最大允许的进程(会话)数。 这些只是Oracle应用中的一些基础问题和解决方案。在实际操作中,还会有更多复杂的问题,如...
11. **查看最大会话数**:使用`V$PARAMETER`视图查询`PROCESSES`参数,或者运行`SHOW PARAMETER processes`命令。 这些是Oracle数据库管理的基础知识,涵盖了从用户认证、数据库创建、资源管理到性能监控等多个方面...
- `SELECT * FROM all_tab_columns WHERE table_name='??'`查找特定表的所有列。 9. **获取触发器、过程和函数的创建脚本**: - `DESCRIBE user_source`查看源代码概要。 - `USER_TRIGGERS`视图提供触发器信息。...
SELECT column_name FROM ALL_TAB_COLUMNS WHERE table_name = 'table_name'; ``` #### 12. 查询表的空间占用情况 查询表的实际大小和空闲空间: ```sql SELECT owner, table_name, num_rows, blocks * db_block_...
11. **查看最大会话数**:可以通过`SELECT * FROM V$PARAMETER WHERE NAME LIKE 'proc%'`查询参数,或者使用`show parameter processes`命令。 12. **许可证信息**:若需查看许可证信息,可以运行`select * from v$...
2. **ORACLE9IAS WEB CACHE**:在Oracle9i Application Server中,Web Cache服务的初始默认用户和密码是`administrator/administrator`。这个组件用于缓存Web内容,提高应用性能。 3. **创建数据库**:在不同版本的...
2. **ORACLE9IAS Web Cache初始默认用户和密码**:Web Cache的默认管理员用户是`administrator/administrator`。 3. **创建Oracle 8.0.5数据库**:通过`orainst`工具,如果有图形界面,可以使用`orainst /m`。 4. ...
11. **查看最大会话数**:通过查询`V$PARAMETER`视图中的`processes`参数可得知当前配置的最大并发会话数,`SHOW PARAMETER processes`也可查看。`V$LICENSE`视图中的`sessions_highwater`记录了系统曾达到的最大...