0

私のJava Web アプリケーションでは、データベース構造全体がModel クラスでカバーされています。これらのモデルを使用すると、データベースから何でもJSP ページに直接出力できるので、とても便利です。次の例を参照してください。

<c:if test="${fn:length(author.books) == 0}">The author has no books.</c:if>

<c:forEach items="${author.books}" var="book">
${book.name}
</c:forEach>

モデルには、データベースから関連する本を取得し、本を表すモデルのコレクションを返すAuthorメソッドがあります。問題は、上記の例ではメソッドが実際に 2 回呼び出され、1 つの冗長なクエリが発生することです。getBooks()

を使用して値を保存できることはわかっています<c:set />が、まず、それを頻繁に使用する必要があり (上記の例はのアプリでは非常に一般的です)、次に、常に機能するとは限りません。例えば:

<c:forEach items="${books}" var="book">
${book.author.name}
</c:forEach>

残念ながら、私のデータベースは結合をサポートしていないため、行ごとにクエリを実行してデータベースから作成者を取得する必要があります (作成者はmemcacheキーで格納されているため、実際にはかなり高速です)。そして、このループを 1 つのページで2 回使用したいとしましょう(大きなメニュー小さなメニューなど)。したがって、各作成者はデータベース (または memcache) から 2 回フェッチされますが、これは実際には望ましくありません。

どうすればそれを回避できますか? 理想的には、JSP の「レンダラー」は取得した値をそれぞれ一時キャッシュに保存し(1 回の要求に対してのみ)、次回はメソッドを再度呼び出す代わりに、このキャッシュされた値を使用する必要があります。もう 1 つの方法は、このキャッシュをモデル オブジェクトに直接実装することですが、コードの半分を書き直さずに効率的に実装する方法がわかりません。何か案は?

4

2 に答える 2

0

最大の問題は、2 番目に説明した例にありました。データストア (または memcache) から同じエンティティを繰り返し取得することを避けたかったのです。幸いなことに、すべてのエンティティは完全に分離されたレイヤーで取得されます。このレイヤーを更新して、フェッチされたすべてのエンティティがキーによって HashMap に格納されるようにしました。この HashMap は単純なキャッシュとして使用されます。1 つのエンティティが複数回要求された場合、キャッシュされた値が使用された後、最初のケースでのみフェッチされます。この HashMap は、リクエストが終了するとクリアされます。

これは、実際の解決策よりも回避策である可能性が高く、他のアイデアにまだ興味があります。

于 2012-09-24T23:15:32.680 に答える
0

JSP はそのようなことを行うべきではありません。表示専用です。

通常のイディオムは、Web 用の Model-2 MVC と呼ばれます。サーブレットはフロント コントローラーとして機能し、JSP リクエストをバック エンド サービスにルーティングします。JSP が表示する必要がある値をマーシャリングする必要があります。すべてのロジックを実行するのはバックエンドです。これには、キャッシュ、データベース、またはリアルタイム計算など、データの取得元が含まれます。

モデル オブジェクトは、キャッシュされているかどうかを認識したり気にしたりしてはなりません。(キャッシュまたは永続化することを決定したという理由だけで、それは Author または Book と同じです。) キャッシュは分離しておいてください。

利用できるものがたくさんあるのに、なぜそのようなことを書くことを考えているのですか? Google で EhCache や Terracotta などを探します。

于 2012-09-16T12:57:54.273 に答える