class PendingOrder < ActiveRecord::Base def sleep_until_processed sleep 0.5 while !processed? reload sleep 0.25 end end end Aug 10 19:43:38 prod-app1 foo[31608]: PendingOrder Load (0.6ms) SELECT * FROM `pending_orders` LIMIT 1 Aug 10 19:43:39 prod-app1 foo[31496]: CACHE (0.0ms) SELECT * FROM `pending_orders` WHERE (`pending_orders`.`id` = 221) So the first query is legit -- but second query is cached, and so forth. Every subsequent query ends up being a cached value, forever. How can I make the above method *not* look at a cache? -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Josh Sharpe wrote:> class PendingOrder < ActiveRecord::Base > def sleep_until_processed > sleep 0.5 > while !processed? > reload > sleep 0.25 > end > end > end > > Aug 10 19:43:38 prod-app1 foo[31608]: PendingOrder Load (0.6ms) > SELECT * FROM `pending_orders` LIMIT 1 > Aug 10 19:43:39 prod-app1 foo[31496]: CACHE (0.0ms) SELECT * FROM > `pending_orders` WHERE (`pending_orders`.`id` = 221) > > So the first query is legit -- but second query is cached, and so > forth. Every subsequent query ends up being a cached value, forever. > > How can I make the above method *not* look at a cache?Not forever! Subsequent queries are cached until an update changes the underlying data. Isn''t it good to read from the cache if the underlying database hasn''t changed? I am assuming that "processed?" reads from a column in your pending_orders table. If something in your application changes that value then the query cache should be cleared automatically. However, if that database change were to happen outside of your Rails application I could see that your code could end up blocking forever. In any case I would recommend adding some "circuit breaker" code to your method to prevent blocking forever. Maybe some sort of timeout/watchdog to limit the amount of time this method could block. -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Josh Sharpe wrote:> class PendingOrder < ActiveRecord::Base > def sleep_until_processed > sleep 0.5 > while !processed? > reload > sleep 0.25 > end > end > end> Robert Walker wrote: >> In any case I would recommend adding some "circuit breaker" code to your >> method to prevent blocking forever. Maybe some sort of timeout/watchdog >> to limit the amount of time this method could block.And, if your Rails application is single treaded then your sleep_until_processed method could block your entire Rails application never allowing other parts of the application to perform the work necessary to update the pending_orders table. Maybe you should consider offloading this work to a background process using something like delayed_job or similar. -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Frederick Cheung
2010-Aug-11 15:19 UTC
Re: reload is using a cache and i dont want it to be
On Aug 11, 11:07 am, Robert Walker <li...-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:> > > So the first query is legit -- but second query is cached, and so > > forth. Every subsequent query ends up being a cached value, forever. > > > How can I make the above method *not* look at a cache? > > Not forever! Subsequent queries are cached until an update changes the > underlying data. Isn''t it good to read from the cache if the underlying > database hasn''t changed? > > I am assuming that "processed?" reads from a column in your > pending_orders table. If something in your application changes that > value then the query cache should be cleared automatically. However, if > that database change were to happen outside of your Rails application I > could see that your code could end up blocking forever. >It''s more than that - the cache is in memory, so the cache won''t be cleared if a different rails instances touches the data Something like PendingOrder.uncached do ... end should do the trick Fred> In any case I would recommend adding some "circuit breaker" code to your > method to prevent blocking forever. Maybe some sort of timeout/watchdog > to limit the amount of time this method could block. > -- > Posted viahttp://www.ruby-forum.com/.-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Frederick Cheung wrote:> On Aug 11, 11:07�am, Robert Walker <li...-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote: >> I am assuming that "processed?" reads from a column in your >> pending_orders table. If something in your application changes that >> value then the query cache should be cleared automatically. However, if >> that database change were to happen outside of your Rails application I >> could see that your code could end up blocking forever. >> > It''s more than that - the cache is in memory, so the cache won''t be > cleared if a different rails instances touches the dataI actually misstated that, sorry. I should have said anything outside the current Rails instance (including other Rails instances). Thanks Frederick for the clarification. And also for the uncached solution. I wasn''t actually aware of that, but it''s definitely good to know. -- Posted via http://www.ruby-forum.com/. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.