2011-02-08 8 views
4

ORMを使用する前に、私たちは常にサービス層でオブジェクトキャッシングを実行しました。これにより、キャッシングの実装を変更することなく、異なるデータレイヤー間を切り替えることができました。エンティティフレームワークとNHibernate - キャッシュはまだサービスレイヤの責任ですか?

今日では、エンティティフレームワーク(主にコードが最初)とNHibernateの両方を使用しています。 NHibernateは、いくつかの第2レベルのキャッシュプロバイダが利用可能な、より良いキャッシング機能を備えているようです。

私が直面しているもう1つの問題は、上記のORMの両方に対して、遅延ロードされたプロパティを使用することです。したがって、キャッシュからオブジェクトを取得する場合は、通常、現在のObjectContext/ISessionにオブジェクトを再接続する必要があります。サービスレイヤでは実際にはできないことです。

リポジトリ/データレイヤーでのキャッシュ実装を実際に検討する必要があります。 EFとNHで共通の解決策が見つかるだろうか?

おかげ ベン

答えて

4

CQRS patternを見ましたか? caching is policyなので、私は、第2層キャッシュのように、 "one size fits all"キャッシュでこれらの決定を自動化しようとしているのは疑いがあります。たとえば、実際にキャッシュしたいものがサイトのホームページのHTMLである場合、2番目のレイヤーキャッシュはメモリの浪費とバグへの招待に過ぎません。

CQRSは、これらの機械的考慮を政策決定に変えます。それはORMにとらわれないものです。

+0

こんにちはクレイグ、リンクありがとう。ウディのビデオは本当に私がこれを掴むのを助けました(http://bit.ly/d29jZU)。あなたの経験では、CQRSはWeb/eコマースアプリケーション、特に「古い」(製品情報)、パーソナライズされた(カート、プロファイル)、ライブの可能性が高いビューレベル)データ。 Udiは、問題がある場合にコマンドを渡して非同期応答を発行することについても話しています。これは、通常はWebアプリケーションで実装するのが簡単ではないものです。 –

+0

amazon.comはこのようなものを(「最終的には一貫して」)開拓しました。そう、はい、私はそれが電子商取引でうまくいくと言います。明らかに、あなたは何が陳腐で何ができないのかを選択する必要があります。しかし、ポイントは技術的な配慮ではなく、ビジネスだということです。 –

+0

既存のアプリケーションに追加できるものか、コードの作成を始める前に実際にそのようなアーキテクチャ上の決定を下すべきなのでしょうか?明らかに、httpキャッシングのような機能は、重要な意味を持たずにいつでも追加することができます。 –

2

私の経験では、ORMが提供する第二レベルのキャッシュは、データベースから取得した実際の結果セットに基づいてデータをキャッシュすることです。これは、オブジェクトのインスタンス化とデータの集計がかなりコストがかかるため、オーバーヘッドが大きくなる可能性があります。

利点は、遅延読み込みなどは問題なく動作しますが、大きな結果はオブジェクトを再投入するときに多くのリソースを消費します。

高価なオーバーヘッドのために、第2レベルのキャッシュとASP.NETキャッシュの組み合わせを使用しています。まれに、数秒(!)も節約できますが、できないという欠点があります遅延ロード・コレクションに追加するか、エンティティーを更新します。

これはNHibernateのみに基づいていますが、私はエンティティフレームワークを使ったことはありませんが、私はすべてのORMフレームワークがこれに苦しんでいると推測しています。

関連する問題