古いセッションの削除
セッションデータの削除 - 永字八法の改良版。つーか、こっちのが全然いい。
PerlからCGI::Sessionを通じてPostgreSQLを使ってセッション管理をしている場合、古いセッションを自動で削除していく方法を考える。
1・セッション情報テーブルにカラムを一つ追加する。
idとa_sessionカラムに加え、セッションの最終更新日を登録するlast_updateを追加する。このlast_updateはtimestamp型で、初期値はnow()とする。
ALTER TABLE sessions ADD last_update TIMESTAMP WITHOUT TIME ZONE DEFAULT now() NOT NULL
2・関数を一つ作成する。
その時、現在のnow()を取得する関数を作る。
CREATE FUNCTION set_last_update() RETURNS opaque AS ' begin new.last_update := 'now'; return new; end; ' LANGUAGE 'plpgsql';
3・テーブルにトリガーを結びつける。
関数とテーブルをトリガーで結びつける。
CREATE TRIGGER before_flush BEFORE UPDATE ON sessions FOR EACH ROW EXECUTE PROCEDURE set_last_update()
4・まとめ
こうすることで、sessionが更新される度に自動的に最終更新日付も更新される。
あとは、日付で3日前とかを削除するDELETE文を定期的に発行するだけで古いセッションが削除される。
DELETE FROM sessions WHERE last_update+interval '1 week' < now();
上記は一週間前から更新されていないセッションを削除する例。