古いセッションの削除

セッションデータの削除 - 永字八法の改良版。つーか、こっちのが全然いい。
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();

上記は一週間前から更新されていないセッションを削除する例。

古いセッションの削除

セッションデータの削除 - 永字八法の改良版。つーか、こっちのが全然いい。
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();

上記は一週間前から更新されていないセッションを削除する例。

古いセッションの削除

セッションデータの削除 - 永字八法の改良版。つーか、こっちのが全然いい。
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();

上記は一週間前から更新されていないセッションを削除する例。