- PR -

staticなHashtableからのデータ削除

1
投稿者投稿内容
コウイチ
常連さん
会議室デビュー日: 2003/11/04
投稿数: 48
投稿日時: 2006-01-13 16:22
Webアプリで、誰がログイン・アウトしたかの情報を知るために、
セッションが破棄されたとき、誰のセッションが破棄されたのかを出力するるように、
下記のようにしています。

コード:
開発環境:Java SDK 1.4.2_10
    :Tomcat 4.1.31

public class SampleListener implements HttpSessionListener
{
    private static Hashtable List = new Hashtable();

    // strSessionId = セッションID
    public static void setList(String strSessionId, String name)
    {
        List.put(strSessionId, name);  // Listに登録
    }

    // セッションが作成時
    public void sessionCreated(HttpSessionEvent hse)
    {
    }

    // セッションが破棄時
    public void sessionDestroyed(HttpSessionEvent hse)
    {
        HttpSession session = hse.getSession();
        if (session != null) {
            String name = (String)List.get(session.getId());
            if (name != null) {
                List.remove(session.getId());  // リストから削除
                System.out.println("名前:[" + name + "]/セッション数:[" + List.size() + "]");
            }
        }
    }
}

セッションを作成後に、SampleListener.setList() を呼び出して、
セッションIDをキーにしてユーザー名を、"Hashtable"に持たせるようにしています。
動き的には、誰のセッションが切れたのかがわかるのでいいのですが、
static で、Hashtableに情報をもっていますので、
sessionDestroyed の中の
・hse.getSession()
・session.getId()
でエラーが起こった場合、(起こらないかもしれませんが・・・)
・List.remove(session.getId());
が行われません。
となると、セッションIDをキーにしてますので、Tomcatを再起動されるまで、
永遠とList(メモリ)に残ってしまうことになるので、(なりますよね?)

Hashtableに、"ユーザー名"と一緒に"セッションの作成時刻"も一緒に持たせて
sessionDestroyed が呼び出されるときに、
List に持たせている情報で作成時刻が1日以上たっているものをチェックして、
削除するようにしようかと思ったのですが、セッション数が多いとまずいかなぁ〜と・・・。

何かいいアイデアを頂けないしょうか?
・・・上記のようなエラーは起こらないのでしょうか?
よろしくお願いします。m(_ _)m
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-01-13 17:00
>・hse.getSession()
>・session.getId()
>でエラーが起こった場合、(起こらないかもしれませんが・・・)
起こらないので心配しなくて大丈夫です。
仕様上は例外もエラーも発生しないことになってますので。
もしそこでエラーが発生するようでしたら Tomcat または JVM 自体正常に動いていませんのでどのような対策をとってもリカバリできないかと。

関係ないですが、List っていうのは別に同名のインターフェースがあるのでちょっと誤解を招きやすい変数名です。あまりオススメできません。
#どちらかといえば List ではなくて Map のはずですし・・

[ メッセージ編集済み 編集者: インギ 編集日時 2006-01-13 17:26 ]
コウイチ
常連さん
会議室デビュー日: 2003/11/04
投稿数: 48
投稿日時: 2006-01-13 17:29
インギさん、返答ありがとうございます。

> 起こらないので心配しなくて大丈夫です。
起こらないんですね、安心しました。

> 関係ないですが、List っていうのは別に同名のインターフェースがあるので
> ちょっと誤解を招きやすい変数名です。あまりオススメできません。
名前は変えようと思います。

また質問のときは、よろしくお願いします。m(_ _)m
1

スキルアップ/キャリアアップ(JOB@IT)