对RUBY + ACTIVERECORD +MYSQL 的一点郁闷解决思路

作者: xwnsy86276
发布时间:2015-07-13 11:21:07

用ruby 写了一些数据处理的脚本,连接到mysql,里面有不少find_by_id
不知道为什么总有很多 “卡”住的情况,javax.microedition.rms.InvalidRecordIDException,kill 掉重新运行,就一切正常

检查mysql ,show processlist ,经常发现,在DESCRIBE xxx表 ,checking permissions

  • | Id    | User          | Host                 | db   | Command     | Time   | State                                                                 | Info                      |
  • | 68645 | syncer   | localhost            | info | Query       |     38 | checking permissions                                                  | describe `v_publish_text` |

MYSQL 的CPU 利用率 立即打满到100%
而且,desc 反复出现,似乎每次find操作都需要 DESCRIBE

实在想不明白,为什么这么多DESCRIBE

我做过以下尝试
1,每次find 都加上:select => "所有字段"

2,以前有 对象.attributes.has_key(:字段),都改为
    @attributes = nil    @attributes = bb.attributes.clone if @attributes.nil?    @attributes.has_key?(:country_id)

3,以前是放在crontabl每分钟 执行一次,现在修改为每次运行中sleep 60 ,每次启动最多可以运行30次。
   也许会提高解析效果。

4,将表引擎原来是 MYISAM 修改为  INNODB

5,尽量少用关系,而采用find(:all,:select => "id",:limit => 10 ....) + find(ids)

6,java.io.IOException,在MY.cnf 中配置 table_open_cache = 2048

请问,DESCRIBE xxx 都是在什么时间调用的? 还有啥可做的?

多问一句,我这些表,采用了MYSQL 的分区,是不是有影响呢?
ruby -v
ruby 1.8.7 (2011-02-18 patchlevel 334) [x86_64-Linux], MBARI 0x6770, Ruby Enterprise Edition 2011.03

gem list :
activerecord (3.0.5)
mysql (2.8.1)




------------------------------------------------------------------------------------------------------------------
问题补充:
isimon 写道
DESCRIBE xxx只在development环境里才会反复调用,production环境中只在启动时调用一次。因此不用过分担心。


hi,我的问题症结也许就在这里。
我知道rails 有 development 和production 之分,不过我这个是 一段脚本,通过crontab 调用。

在程序最初就设置了 ENV['RAILS_ENV'] ||= 'production' ,似乎不对症

在什么地方可以设置一下 production ?

------------------------------------------------------------------------------------------------------------------
问题补充:
是不是 也是用

ruby -e production  xxx.rb
  ?


------------------------------------------------------------------------------------------------------------------
问题补充:
ruby  xxx.rb  -e production 

这样写才能执行。。。不知道是否有效

------------------------------------------------------------------------------------------------------------------
问题补充:
似乎无效。。。。
MYSQL 更加变态 ,desc 超过120秒

| Id    | User          | Host       | db   | Command     | Time   | State                                                                 | Info                      |
| 68676 | syncer   | localhost            | info | Query       |    123 | checking permissions                                                  | describe `v_publish_info` |

------------------------------------------------------------------------------------------------------------------
问题补充:
ruby -h
Usage: ruby [switches] [--] [programfile] [arguments]
-e 'command'    one line of script. Several -e's allowed. Omit [programfile]

------------------------------------------------------------------------------------------------------------------
问题补充:
isimon 写道
DESCRIBE xxx只在development环境里才会反复调用,production环境中只在启动时调用一次。因此不用过分担心。


查看 rails 的config/environments/下
development.rb:  config.cache_classes = false production.rb:  config.cache_classes = true test.rb:  config.cache_classes = true


是不是与 cache_classes 有关?在脚本方式下,如何做到?

------------------------------------------------------------------------------------------------------------------
问题补充:
这条路 走下去,似乎要 重读一遍 rails application 的代码。。。

------------------------------------------------------------------------------------------------------------------
问题补充:
以DEBUG 方式执行 脚本
每个insert 前都有。
D, [21:37:33#11964] DEBUG -- :   SQL (1.0ms)  describe `tasks`

对应着一个个 xxx.new

印象中activerecord 会做 SQL CACHE ,打印出来,应该是
CACHE (0.0ms)  describe `tasks`


为什么 我现在没有cache ?

------------------------------------------------------------------------------------------------------------------
问题补充:
isimon 写道
DESCRIBE xxx只在development环境里才会反复调用,production环境中只在启动时调用一次。因此不用过分担心。


烦劳您 告诉我,如何强制为 production环境,作为独立程序而 不是在rails。
知其然不知其所以然,没有解决方案

------解决方案--------------------------------------------------------
DESCRIBE xxx只在development环境里才会反复调用,production环境中只在启动时调用一次。因此不用过分担心。
------解决方案--------------------------------------------------------
可参考:
问一个比较郁闷的有关问题!有关mysql数据更新的   http://www.myexception.cn/java-web/10700.html


相关的主题文章:

版权声明:本文为博主原创文章,未经博主允许不得转载。

来源:http://blog.csdn.net/xwnsy86276/article/details/7268052

推荐: