2014-05-12 32 views

回答

2

大約一年前,我遇到了一個非常類似的問題,我的解決方案是編寫一個使用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插件),它使我的數據庫大小顯着下降。我還爲這個耙子任務添加了一些日誌記錄,這樣我就可以很快看到它是如何做的,而不必定期觀看它。如果你願意,你可以刪除它。

重要的是要注意,如果您的應用程序使用了所有Heroku dyno小時,則調度程序將導致向您的信用卡收取一些動態小時數。換句話說,附加組件是免費的,但使用它可能不是。

+1

謝謝您的回覆。我無法測試答案,因爲我必須從這個問題開始並通過手動刪除行來解決問題。我相信你的回答是正確的,我會標記它,但會執行它,並在評估後再次。謝謝! – MicFin