ruby-on-rails – 是否有可能在Ruby 1.9中透明地实现ActiveRecor
我正在使用最近更新为
Ruby 1.9.2和mysql2 gem的大型代码库的现有Rails 2站点??.我注意到这个设置允许非阻塞数据库查询;你可以做client.query(sql,:async => true)然后调用client.async_result,它会阻塞直到查询完成.
在我看来,通过让所有返回集合的ActiveRecord查询拒绝阻塞,直到在集合上调用方法,我们才能获得性能提升.例如 @widgets = Widget.find(:all,:conditions=> conditions) #sends the query do_some_stuff_that_doesn't_require_widgets @widgets.each do #if the query hasn't completed yet,wait until it does,then populate @widgets with the result. Iterate through @widgets ... 这可以通过猴子修补Base :: find及其相关方法来创建新的数据库客户端,异步发送查询,然后立即返回一个Delegator或其他代理对象,当调用任何方法时,调用它client.async_result,使用ActiveRecord实例化结果,并将方法委托给它. ActiveRecord关联代理对象已经类似于实现ORM. 但是我找不到任何人这样做过,而且在任何版本的Rails中似乎都不是一个选项.我已经尝试自己实现它并且它在控制台中工作(只要我追加; 1到调用所有内容的行,以便在结果上不调用to_s).但它似乎与各种其他魔法相撞并产生各种问题. 那么,出于某些我没有想到的原因,这是一个坏主意吗?如果没有,为什么它不是ActiveRecord已经运行的方式?是否有一种干净的方式来实现它? 解决方法
我怀疑.async_result方法不适用于所有数据库驱动程序;如果没有,它不是可以合并到通用ActiveRecord调用的东西.
循环遍历大型记录集时,一种更便于携带的方法是使用find_each或find_in_batches.我认为他们将在rails 2.3以及rails 3.x中工作. http://guides.rubyonrails.org/active_record_querying.html#retrieving-multiple-objects-in-batches (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |