Lost automatic ActiveRecord caching by migrating from Rails 3 to Rails 4

Grocery

I have a rather intense method processing rather large batches of things. It depends on ActiveRecord to be conservative about hitting database with exact same query zillion of times.

This is what I had in Rails 3:

  CACHE (0.0ms)  SELECT `song_work_numbers`.* FROM `song_work_numbers` ...
  CACHE (0.0ms)  SELECT `variance_statement_line_matches`.* FROM `variance_statement_line_matches` ...
  CACHE (0.0ms)  SELECT `songs`.* FROM `songs` ...
  CACHE (0.0ms)  SELECT `variance_statement_line_matches`.* ...
  CACHE (0.0ms)  SELECT COUNT(*) FROM `productions` ...
  CACHE (0.0ms)  SELECT `productions`.* FROM `productions` ...
  ProductionWorkNumber Load (0.6ms)  SELECT `production_work_numbers`.* FROM `production_work_numbers` ...
  SQL (0.4ms)  SELECT COUNT(*) FROM `production_episodes` ...
  ProductionEpisode Load (0.4ms)  SELECT `production_episodes`.* FROM `production_episodes` ...
Processed Line [449] in 0.010037 s

  CACHE (0.0ms)  SELECT `song_work_numbers`.* FROM `song_work_numbers` ...
  CACHE (0.0ms)  SELECT `variance_statement_line_matches`.* FROM `variance_statement_line_matches` ...
  CACHE (0.0ms)  SELECT `songs`.* FROM `songs` ...
  CACHE (0.0ms)  SELECT `production_work_numbers`.* FROM `production_work_numbers` ...
  CACHE (0.0ms)  SELECT `variance_statement_line_matches`.* FROM `variance_statement_line_matches` ...
  CACHE (0.0ms)  SELECT COUNT(*) FROM `productions` ...
  CACHE (0.0ms)  SELECT `productions`.* FROM `productions` ...
  CACHE (0.0ms)  SELECT `production_work_numbers`.* FROM `production_work_numbers` ...
  CACHE (0.0ms)  SELECT COUNT(*) FROM `production_episodes` ...
  CACHE (0.0ms)  SELECT `production_episodes`.* FROM `production_episodes` ...
Processed Line [450] in 0.006033 s

And this is what I get in Rails 4

  SongWorkNumber Load (1.5ms)  SELECT `song_work_numbers`.* FROM `song_work_numbers` ...
  Variance::StatementLineMatch Load (0.4ms)  SELECT `variance_statement_line_matches`.* FROM `variance_statement_line_matches` ...
  Song Load (0.5ms)  SELECT `songs`.* FROM `songs` ...
  ProductionWorkNumber Load (1.9ms)  SELECT `production_work_numbers`.* FROM `production_work_numbers` ...
  Variance::StatementLineMatch Load (0.9ms)  SELECT `variance_statement_line_matches`.* FROM `variance_statement_line_matches` ...
   (2.9ms)  SELECT COUNT(*) FROM `productions` ...
  Production Load (1.5ms)  SELECT `productions`.* FROM `productions` ...
  ProductionWorkNumber Load (1.7ms)  SELECT `production_work_numbers`.* FROM `production_work_numbers` ...
   (0.6ms)  SELECT COUNT(*) FROM `production_episodes` ...
  ProductionEpisode Load (112.2ms)  SELECT `production_episodes`.* FROM `production_episodes` ...
[Processed line 449 in 0.137435 sec]

  SongWorkNumber Load (1.5ms)  SELECT `song_work_numbers`.* FROM `song_work_numbers` ...
  Variance::StatementLineMatch Load (0.4ms)  SELECT `variance_statement_line_matches`.* FROM `variance_statement_line_matches` ...
  Song Load (0.5ms)  SELECT `songs`.* FROM `songs` ...
  ProductionWorkNumber Load (1.7ms)  SELECT `production_work_numbers`.* FROM `production_work_numbers` ...
  Variance::StatementLineMatch Load (0.4ms)  SELECT `variance_statement_line_matches`.* FROM `variance_statement_line_matches` ...
   (0.5ms)  SELECT COUNT(*) FROM `productions` ...
  Production Load (1.5ms)  SELECT `productions`.* FROM `productions` ...
  ProductionWorkNumber Load (1.9ms)  SELECT `production_work_numbers`.* FROM `production_work_numbers` ...
   (0.6ms)  SELECT COUNT(*) FROM `production_episodes` WHERE ...
  ProductionEpisode Load (0.5ms)  SELECT `production_episodes`.* FROM `production_episodes` ...
[Processed line 450 in 0.023306 sec]

As you can see this is much much slower. When going over 50K+ lines those milliseconds really add up.

Queries are identical. Code is the same. The only difference is that in Rails 4 version that code is ran from the delayed_job and in Rails 3 it was handled during normal browser request.

Is there a setting or something that I missed?

Grocery

I figured it out. SqlCache is used via middleware in Rails: use ActiveRecord::QueryCache This means that it's the ActionController that wraps action processing with the cache blanket. Obviously within delayed job there's no ActionController and no caching. All you need to do to bring caching back is this:

def method_ran_by_delayed_job
  ActiveRecord::Base.cache do
    # all your crazy code
  end
end

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

rails 4 data iteration from activerecord search

ActiveRecord query with Rails 4

Disable ActiveRecord for Rails 4

Rails 4 activerecord group

rails 4 ActiveRecord::StatementInvalid

Rails 4 activerecord filter

what are the steps to follow for migrating a project from rails 3.2.13,ruby 1.9.1 to rails 4.2 or rails 4 other versions?

Virtual attributes in Rails 4 from Rails 3

Prevent Rails 4 Sprocket Asset Pipeline from caching a specific file

migrating from rails 4.2 to 5 issue need to downgrade ActiveRecord version to work with 1 gem

Rails 4 app ActiveRecord::MigrationProxy Devise 3 migration error

Migrating from Rails 4 to Rails 5: using ActionDispatch::Request.parameter_parsers and config.middleware

Append operator "<<" no longer converting AssociationRelation to Arrays and adding object automatically on Rails 5 after migrating from Rails 4

Rails 4 cocoon ActiveRecord::AssociationTypeMismatch

Rails 4 ActiveRecord::first not working

Rails 4 ActiveRecord multiple queries

Rails 4 Error: ActiveRecord::AssociationTypeMismatch

How do I remove ActiveRecord from an existing Rails 4 Application?

Rails 4 - CRUD error after migrating to Postgresql

Rails update ActiveRecord from a form

Run ActiveRecord commands on Rails console without SQL caching

How to disable logging for rails 4 caching

Why is Rails 4 caching all scopes?

Rails 4 Simple Model Caching With Redis

Disable Sprockets asset caching in development on Rails 4

Caching issue with Rails 4 and Nginx + Passenger

How to leverage browser caching in Rails 4?

migrating rails app from postgresql to mysql

Rails 4 AR `from` different than rails 3?

TOP Ranking

HotTag

Archive