2011-08-04 1 views
0

シナリオはこれです。データをセッションに保存します。データが古くなったかどうかをいつ、どのように検出するのですか。

  1. ユーザーが
  2. ハンドラがセッションでの結果、店舗
  3. ユーザーが閲覧した後
  4. を表示するためにそれらのいずれかをクリックすることを決定し、その結果を参照してくださいを見つけ、検索に行い、ユーザーが
  5. を「戻る検索する」ためにクリック
  6. ハンドラは、その検索するためのバックを検出し、検索をスキップし、代わりに、期待通りのユーザーが同じ結果を見
  7. セッションから取得し

#5で、新しいアイテムが作成され、ユーザーの検索条件に合致する場合は、結果の一部にする必要があります。しかし、#5ではセッションから取得しているだけなので、それを検出することはできません。

私の質問は、私はチェックの余分なステップを行う必要がありますか?もしそうなら、実際の検索を行わずに効果的にチェックする方法(目的を破るだろう)?多分count(*)....を選択し、それをセッションのresultsetの数と比較しますか?

答えて

1

検索結果をセッションにキャッシュすることは強くお勧めします。 Webアプリケーションは、最小のセッション状態を可能にするよう努めなければならない。ユーザーセッション状態に対して検索結果(恐らく数kb以上)をキャッシュするブランケットロジックを組み込むことで、実際にはメモリ問題が発生する可能性があります。

代わりに、独自のキャッシュを管理するシングルトン検索サービスが必要です。これは、セッション内でキャッシュを行う方法と似ていますが、いくつかの利点があります。

  • ユーザー間で共通の検索結果を再利用できます。これは重要な検索の種類によって異なります。
  • サービスレイヤでキャッシュサイズを管理できます。 ehcacheのようなものは実装が簡単で、多くの設定が可能です(メモリ不足の問題からの保護)
  • サービス層でキャッシュの有効性を管理できます。すなわち、「アイテムの更新」サービスがそのsave()メソッドをトリガした場合、そのキャッシュ全体、または新しく更新/作成されたアイテムに対応するキャッシュされた結果だけを無効にするよう検索サービスに指示することができる。

上記の3番目のポイントは、あなたの主な質問です。

+0

私はあなたの提案に似て何かを考えていた。あなたの3番目のポイントを与え、その時apiをキャッシュし、もはやサーブレット/コントローラ層には責任を負いません。私はこれを続行すると思いますが、私はライブラリを読んで読んでいますが、これらはコンフィギュレーション上の問題であり、プログラム的ではないという印象があります。 –

+0

ええ、私はかなり広範囲にehcacheを使ってきました。あなたは単純な設定から必要なものすべてを手に入れることができます。 hibernateのehcacheとoscacheのコンビニエンスラッパークラスとそれに対応するSpringフレームワークの設定を調べてください。 – jkraybill

+0

さて、私は読んでみましょう。私は私の質問への答えは、HTTPセッション層でそれをやってはいけないと思うが、サーバーまたはdb層でそれを行う。 –

2

あなたのビジネスニーズによって異なります。ユーザーに最新の最新の結果が必要な場合は、それらをリルルする必要があります。

対応する削除がある可能性があるため、カウントは100%ではありません。

タイムスタンプなどを比較することは可能かもしれませんが、複雑さが増すとそれ以上の問題が発生する可能性があります。

簡単にして検索を再開してください。

+0

追加以外の削除が発生する可能性があることを考慮すると良い点があります。実際には、私はクリックして検索の再実行を見た "検索に戻って"何か通常行わ... –

0

新しいアイテムがあるかどうかを確認するには、カウントを取得するだけでも検索を再開する必要があります。

効果的に検索結果をキャッシュしています。したがって、通常の回答は、一定の時間(例えば、結果は1分間のみ有効)の後に結果を期限切れにするか、またはデータが変更されたときにキャッシュが無効にされ、検索が再実行。

ユーザーがそこに戻るまでに新しい結果が出る可能性はありますか?検索結果ページに「更新」ボタンを置くだけで検索を再開することができます。

0

DBアイテムにはどのようなリフレッシュレートが必要ですか?このようなシナリオに気づいていないため、短い間隔でも検索結果が大幅に変化しますが、別のケースがあるかもしれません。

DBが別のスレッドによって作成され、結果を検索する別の独立したスレッドがある場合、キャッシュ内のDBに挿入された最新のアイテムのタイムスタンプを追跡すると仮定します。

ユーザーが検索結果を再度見たい場合、タイムスタンプを再度比較します。つまり、キャッシュタイムスタンプとDBに挿入された最後のアイテムのタイムスタンプを比較します。一致するものがない場合は、キャッシュから再度クエリを表示します。

私の前提によれば、DBがあまり頻繁に更新されていない(特定の検索条件に条件が満たされていない)ことが確認された場合、DBをあまり頻繁にクエリすることができません。

関連する問題