1

私のコードは次のことを行っています (例として、java.lang.ref.SoftReference へのパッケージ パスを指定する理由は、それが私自身の実装ではないことに注意するためです:-):

...
List<String> someData = new ArrayList<String>();
someData.add("Value1");
someData.add("Value2");
...
java.lang.ref.SoftReference softRef = new SoftReference(someData);
...
HttpSession session = request.getSession(true);
session.setAttribute("mySoftRefData", softRef);
...

以降:

...
java.lang.ref.SoftReference softRef = session.getAttribute("mySoftRefData");
if (softRef != null && softRef.get() != null) {
   List<String> someData = (List<String>)softRef.get();
   // do something with it.
}
...

欠点はありますか?見えないのはどれですか?ありがとうございました!

4

3 に答える 3

1

明らかな欠点は、リストが予期せず消えてしまう可能性があることです。いずれにせよ、セッションは有効期限が切れた後にガベージ コレクションされるため、SoftReference のユース ケースは実際には見当たりません。リストがかなり大きくなる場合 (少なくとも SoftReference の使用を正当化するのに十分なほど)、別のストレージ (DB、一時ファイル) をお勧めします。

于 2010-03-16T23:44:26.470 に答える
1

自分でコード内の他の場所を参照せず、JVM がガベージ コレクターを実行している場合、参照がセッションに存在しなくなるリスクがあります。ただし、弱い参照を使用する場合よりも可能性は低くなりますが、それでも可能性はあります。

私はWebアプリケーションではそれをしません。純粋なセッション スコープ データ (ログイン ユーザー、ショッピング カートなど) の場合は、通常の方法でセッション スコープに入れます。セッションが期限切れまたは無効になった場合、他の場所で参照されていないものは、何らかの方法でガベージ コレクションされます。セッション スコープは、「ソフト」キャッシュとして機能することを意図していません。または、実際にリクエストスコープのデータである場合は、リクエストスコープに保存してください。それ以外の場合は、別の種類のデータ ストアを使用します。

于 2010-03-16T23:45:05.020 に答える
0

アプリケーションに 100% 必要ではないデータを使い捨てキャッシュに入れることは非常に良い考えです。ピーク時にはそれらは破棄され、差し迫ったニーズに対応するためにより多くのリソースが節約されます。

要するに、行く方法。

于 2010-03-16T23:44:46.503 に答える