会话存储,活动记录存储向heroku数据库保存太多行

时间:2014-05-12 13:43:27

标签: ruby-on-rails-3 session cookies heroku session-cookies

当出现cookie溢出问题时,我使用以下stackoverflow应答来利用活动记录存储并创建会话表。

Cookie overflow in rails application?

但是,现在我已达到Heroku数据库限制,因为每个会话都在创建一行。

有没有办法让会话过期并在一段时间后删除?我错过了一个未包含在stackoverflow答案中的步骤吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我在大约一年前碰到了一个非常类似的问题,我的解决方案是编写一个rake任务,每隔一段时间使用Heroku scheduler free add-on运行一次。这是rake的任务:

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

基本思想是删除超过一周的任何会话信息,但您可以使用Heroku中的BEFORE_DATE环境变量将其更改为您希望的任何值。请注意,在第一次运行时,这可能需要相当长的时间,具体取决于您有多少陈旧会话,但后续运行应该更快。

我每天早上都会这样运行(再次使用Scheduler附加组件),它会大大降低我的数据库大小。我还为这个rake任务添加了一些日志记录,因此我可以快速查看它是如何进行的,而无需定期观看。如果您愿意,可以将其删除。

重要的是要注意,如果您将所有Heroku dyno小时数用于您的应用程序,则调度程序将导致您的信用卡收取一些dyno小时费用。换句话说,加载项是免费的,但的使用可能不是