运维开发网

ruby-on-rails – 是否有可能在Ruby 1.9中透明地实现ActiveRecord查询的Future模式?

运维开发网 https://www.qedev.com 2020-07-19 19:12 出处:网络 作者:运维开发网整理
我正在使用最近更新为 Ruby 1.9.2和mysql2 gem的大型代码库的现有Rails 2站点​​.我注意到这个设置允许非阻塞数据库查询;你可以做client.query(sql,:async => true)然后调用client.async_result,它会阻塞直到查询完成. 在我看来,通过让所有返回集合的ActiveRecord查询拒绝阻塞,直到在集合上调用方法,我们才能获得性能提升.
我正在使用最近更新为 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

0

精彩评论

暂无评论...
验证码 换一张
取 消