【问题标题】:Session store, active record store saving too many rows to heroku database会话存储,活动记录存储将太多行保存到heroku数据库
【发布时间】:2014-05-13 00:24:26
【问题描述】:

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

Cookie overflow in rails application?

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

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

感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    大约一年前我遇到了一个非常相似的问题,我的解决方案是编写一个 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 环境变量将其更改为您希望的任何值。请注意,在第一次运行时,这可能需要相当长的时间,具体取决于您拥有多少陈旧会话,但后续运行应该会更快。

    我每天早上的某个时间运行此程序(再次使用调度程序插件),它使我的数据库大小显着减小。我还在这个 rake 任务中添加了一些日志记录,这样我就可以快速了解它的运行情况,而无需定期观看。如果您愿意,可以将其删除。

    请务必注意,如果您将所有 Heroku dyno 小时数用于您的应用程序,调度程序将导致从您的信用卡中扣除一些 dyno 小时数。换句话说,插件是免费的,但使用它可能不是。

    【讨论】:

    • 感谢您的回复。我无法测试答案,因为我不得不从该问题继续并通过手动删除行来修复它。我相信你的答案是正确的,我会这样标记它,但会实施它并在之后再次评估。谢谢!
    猜你喜欢
    • 2013-05-07
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2020-04-23
    • 2020-09-11
    • 1970-01-01
    相关资源
    最近更新 更多