Question

When having a cookies overflow issue, I used the following stackoverflow answer to utilize active record store and create a sessions table.

Cookie overflow in rails application?

However, now I have reached my Heroku database limit because every session is creating a row.

Is there a way to have the sessions expire and delete after a period of time? Am I missing a step that is not included in the stackoverflow answer?

Thank you for your help!

Was it helpful?

Solution

I ran into a very similar issue about a year ago, and the solution I had was to write a rake task which ran every so often using the Heroku scheduler free add-on. Here's the rake task:

namespace :maintenance do
  desc "Cleanup stale sessions (optional ENV[\"BEFORE_DATE\"] = yyyy/mm/dd)"
  task :clear_stale_sessions => :environment do
    before_date = ENV["BEFORE_DATE"] || 1.week.ago

    start_timestamp = Time.now

    if Rails.env.production?
      puts "#{start_timestamp} -- Beginning deleting of stale sessions before #{before_date}..."
    else
      Rails.logger.info "#{start_timestamp} -- Beginning deleting of stale sessions before #{before_date}..."
    end

    deleted_session_count = ActiveRecord::SessionStore::Session.delete_all(["updated_at <= ?", before_date])

    finished_timestamp = Time.now

    current_session_count = ActiveRecord::SessionStore::Session.count

    if Rails.env.production?
      puts "#{Time.now} -- Finished deleting of stale sessions before #{before_date} -- Deleted Sessions: #{deleted_session_count} - Current Sessions: #{current_session_count} -- Time: #{(finished_timestamp - start_timestamp)} seconds."
    else
      Rails.logger.info "#{Time.now} -- Finished deleting of stale sessions before #{before_date} -- Deleted Sessions: #{deleted_session_count} - Current Sessions: #{current_session_count} -- Time: #{(finished_timestamp - start_timestamp)} seconds."
    end
  end
end

The basic idea is to delete any session information older than a week, but you can use the BEFORE_DATE environment variable in Heroku to change this to any value you wish. Note that on the first run, this may take quite some time depending on how many stale sessions you have, but subsequent runs should be faster.

I run this daily sometime early in the morning (again, using the Scheduler add-on) and it's kept my database size down significantly. I also added some logging to this rake task so I could quickly see how it is doing without having to watch it regularly. You can remove this, if you'd like.

It's important to note that, if you're using all of your Heroku dyno hours for your application, the scheduler will result in some dyno hours being charged to your credit card. In other words, the add-on is free, but use of it may not be.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top