MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So löschen Sie alte/abgestandene Sitzungen bei Verwendung des Mongo DB-Sitzungsspeichers in Ruby on Rails 3.2

Der Schlüssel zur Lösung dieses Problems liegt darin, zu verstehen, dass die direkte Verwendung von Mongoid Methoden, wenn der session_store Ihrer Rails 3-Anwendung auf mongoid_store eingestellt ist würde diese Art von direkter Datenbankinteraktion niemals zulassen.

Also stattdessen, indem Sie Mongoid nur für die grundlegende Datenbankverbindung verwenden, aber dann tatsächlich mit dem Moped interagieren Kern von Mongoid direkt auf einer Treiberbetriebsebene, die gleiche Funktionalität kann mit Leichtigkeit erreicht werden! Hier ist der Mongoid/Moped rake Aufgabe, die ich mir ausgedacht habe und die ganz gut funktioniert:

namespace :sessions do
  stale_window = 7
  desc "Clear stale DB sessions older than #{ stale_window } days."
  task :cleanup => :environment do
    db = Mongoid::Sessions.default
    begin
      db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all
    rescue Moped::Errors::SocketError => e
      # Rescue here if needed. If not, the screwed up process dies silently.
    end
  end
end

Die Verbindung wird über db = Mongoid::Sessions.default eingestellt und die Magie passiert in der Zeile:

db[:sessions].where('updated_at' => { '$lt' => stale_window.days.ago }).sort(updated_at: 1).no_timeout.remove_all

Ich habe ein stale_window gesetzt variabel, damit ich den Bereich dieser Aufgabe leicht anpassen kann; setzt den DB-Wert sowie die Beschreibung. Um es zu verwenden, führe ich es wie folgt aus dem Codebasispfad aus:

RAILS_ENV=production bundle exec rake sessions:cleanup

Und natürlich einfach den RAILS_ENV ändern Wert, der der Umgebung entspricht, in der Sie diese Aufgabe ausführen möchten; wie staging , development oder wie auch immer Sie Ihre Umgebung nennen könnten. Nachdem Sie diesen rake ausgeführt haben Aufgabe, die sessions Die Sammlungstabelle wird auf etwas realistischeres mit der realen Nutzung reduziert und die Gesamtgröße der Datenbank ist vernünftiger zu handhaben.