Linq to SQL でキャッシュを実装するにはどうすればよいですか?
-
09-06-2019 - |
質問
私たちは DAL の仕事で LINQ to SQL を使い始めたばかりですが、アウト キャッシュ モデルの標準を実際には考えていません。以前は、すべての DAL クラスが継承するキャッシュ マネージャー プロパティを実装する基本「DAL」クラスを使用していましたが、現在はそれがありません。LINQ to SQL の結果をキャッシュするための「標準」アプローチを考え出した人はいるでしょうか?
違いがあれば、私たちは Web 環境 (IIS) で作業しています。これが最終的には次のような結果になる可能性があることはわかっています 主観的な という疑問はありますが、それでも情報は貴重だと思います。
編集: 明確にするために、私は個々の結果のキャッシュについて話しているのではなく、すべてのリンク メソッドが同じキャッシュ アーキテクチャを使用するようにキャッシュを設定する方法など、アーキテクチャ ソリューションを求めています。
解決
簡単な答え:リポジトリ パターン (Evans によるドメイン駆動設計を参照) を使用してエンティティを取得します。各リポジトリは、理想的にはリポジトリの各インスタンスがシングルトン キャッシュにアクセスできるようにすることで、保持するものをキャッシュします (各スレッド/リクエストは新しいリポジトリをインスタンス化しますが、存在できるキャッシュは 1 つだけです)。
上記の答えは 1 台のマシンでのみ機能します。これを多くのマシンで使用できるようにするには、次を使用します。 memcached キャッシュソリューションとして。幸運を!
他のヒント
私の LINQクエリ結果キャッシュ おそらくあなたが探しているものです。
var q = from c in context.Customers
where c.City == "London"
select new { c.Name, c.Phone };
var result = q.Take(10).FromCache();
ピート。
それはあなたの鼻の下にあります:
List<TableItem> myResult = (from t in db.Table select t).ToList();
ここで、古い DAL から返されたデータをキャッシュした場合と同様に、myResult をキャッシュするだけです。
見つけました この郵便受け, 、LINQ オブジェクトをキャッシュする手段として拡張メソッドを提供します。
私は今、Linq2SQL に適したキャッシュ ソリューションを見つけようと、弱点を克服するために壁に頭をぶつけてきました。正直に言うと、すべてに適合するものを見つけるのに本当に苦労しています...
(IQueryable を再実装しない限り) キャッシュは Linq ステートメントの外部で実行する必要があるため、リポジトリ パターンは Linq の有用性を制限する傾向があります。
さらに、オブジェクトをキャッシュする場合、遅延読み込みとオブジェクト追跡はどちらも絶対に避けるべきことであり、更新の実行がやや難しくなります。
同時実行性の高い Web プロジェクト内で実際にこの問題を解決できた人は、ぜひ協力して世界を救ってください。:)
おそらく少し遅い答えであることは理解しています...それでも、試してみることができます LinqToCache プロジェクト。可能であれば、任意の LINQ クエリに SqlDepdency をフックし、サーバー側のクエリ通知を介してアクティブなキャッシュの無効化を提供します。クエリは通知に対して有効なクエリである必要があります。を参照してください。 通知用のクエリの作成. 。テーブルが 2 部構成の名前 (dbo.Table
, 、だけでなく Table
).
の「ReferenceData」クラスの「GetReferenceData」メソッドを参照してください。 この記事: http://blog.huagati.com/res/index.php/2008/06/23/application-architecture-part-2-data-access-layer-dynamic-linq/
L2S を使用して取得したデータをキャッシュするために、asp.net ページ キャッシュを使用します。