パフォーマンスが低いため、少し最適化する必要があるレガシーWebサイトがあります。これは、データ層としてlinq to sqlを使用し、UIパターンとしてMVPパターンを使用するasp.netショッピングWebサイトです。
データベースで最もコストのかかるエンティティは、1対多の関係を持つ製品テーブルとカテゴリテーブルです。管理者グループのユーザーが製品またはカテゴリを追加することを決定しない限り、これら2つのエンティティは定期的に変更されない可能性があります。だから、もし私が自分のデータを生かしておく方法があったら…</ p>
最初は、データの取得にAJAXを使用して、クエリまたはバインドする必要のあるエンティティのみを作成することを考えましたが、新しいDataContextインスタンスを作成せずにそれを行うにはどうすればよいですか?!! 一方、DataContext全体にキャッシュを使用することは、メモリコストのために悪い決定と見なされます。では、ここで最良のオプションは何でしょうか?どうすれば改善できますか?
アップデート
1)@HatSoftが提案したことを実行します。
短所:これらのアプローチはコードには役立たず、データベースのみに役立ちます。これに加えて、レンダリングされたhtmlではなくデータをメモリに配置しているため、メモリの問題が発生する可能性がありますが、これはデカップリングに関する最良のオプションである可能性があります。
2)出力キャッシュを使用すると、*。aspxワイルドカードを使用してhttpハンドラーに次のコードがあります。
string pagePath = Context.Request.Url.AbsolutePath;
object cacheKey = application[pagePath];
if(cacheKey == null)
return; //application restarted/first run so cache the stuff
else
Context.Response.RemoveOutputCacheItem(pagePath);
短所:ここで、pagePathをページが使用する各データベースエンティティにリンクする必要がありますが、そうすると、それらを分離するのではなく、結合します。このアプローチでも、少しハードコーディングが必要になります。
3)別の解決策は、制御キャッシュモードではなくポストキャッシュモードでの出力キャッシュです。Subsituation要素を使用し、OutPutCacheの期間を86400に設定して、ページが24時間ごとに再作成されるようにします。
短所: Subsituation要素のhtml出力を動的に生成するためのユーザーコントロールのハードコーディング。
それで、あなたは何を提案しますか?