0

Application に固有のデータを格納するために静的マップを使用する既存の Web ベースのアプリケーションに取り組んでいます。

これは、以下にConcurrentHashMap示すようにデータを a 内に格納する責任がある以下の私のコードです。

public class MyClass 

    // Class variable
    private static Map<String, UserThread> usermap = new ConcurrentHashMap<String, UserThread>();  

// Inside a Method 
public void userData()
 {
 UserThread  userThread= usermap.get(getLoginId());
 if (userThread == null) {
 userThread = new UserThread();
 userThread.start();
 usermap.put(getLoginId(), userThread);
 }
}

アプリケーションは正常に動作しています。ここで私の質問は、静的変数内にデータを格納できるため、これは有効なコードですか?? (ここで、 StaticConcurrentHashMapには Application に固有のデータが含まれています)

4

4 に答える 4

2

特に Web アプリケーションなどのマルチスレッド環境では、あらゆる種類の静的変数とキャッシュを避ける必要があります。コードにはいくつかの問題があります。

  1. マップから UserThreads を削除しますか? それらをいつ削除する必要があるかをどのように知ることができますか? クライアントのブラウザがクラッシュした場合はどうなりますか? それらを削除しないと、アプリケーションがしばらく実行された後にメモリ不足エラーが発生します。
  2. if (userThread == null) 別のスレッドが と の間にUserThread を追加する可能性があるため、使用する方法で ConcurrentHashMap を使用することはスレッドセーフではありませんusermap.put(getLoginId(), userThread);。HashMap の同時実行バージョンは、見かけどおり、スレッドセーフに関するすべての問題を魔法のように解決するわけではありません。
  3. サーブレット コンテナーで独自のスレッドを生成することはお勧めできません。バックグラウンド タスクを実行するためのより良い方法がありますが、最初に、スレッドが何をしようとしているのかを説明する必要があります。

一般に、どのような種類のアプリケーションでも、そのような静的キャッシュを使用することはお勧めできません。あなたの場合、アプリケーション固有のデータをユーザーのセッションに保持する方がはるかに良いでしょう。

于 2012-09-24T10:29:07.243 に答える
1

スタティック マップでは、マップに追加された各エントリのライフ サイクル (つまり、誰が追加するのか、エントリがそこにとどまる期間、およびいつ削除されるのか) が確実でない限り、メモリ リークのリスクに遭遇します。 GC 中に請求できること。そうしないと、アプリケーションがメモリを使い果たし、OOME をスローし始めます。

于 2012-09-24T10:24:28.057 に答える
0

この場合、1 台のマシンにログインするユーザーは、2 台目のマシンと同じセッションを持つことになります。それは良い方法ではないに違いない。

について少し前に尋ねたところSemi static field in Java application、Alessandro Santini はThreadLocal. これをチェックしてください。

于 2012-09-24T10:22:56.200 に答える
0
  1. 私の知る限り、仕様によれば、コンテナ内で独自のスレッドを開始することは許可されていません。これには WorkManager を使用することになっています。しかし、私が知っている唯一のサーバーは、Websphere アプリケーション サーバーです。

  2. 原則として、静的変数は問題ありません。もちろん、クラスター化された環境で実行する場合、各サーバーには静的変数の独自のインスタンスがあります。これは問題になる場合とそうでない場合があります。

技術的には大丈夫かもしれません。

一方で、これらすべてのスレッドで何を達成しようとしているのか、私は本当に興味があります。ユーザーごとに 1 つのスレッドを開始すると、これは DOS 攻撃の優れた攻撃ベクトルになります。また、なぜこのようなことをしたいのかわかりません。

于 2012-09-24T10:31:43.603 に答える