2015-11-12 32 views
10

このプロジェクトではEntity Frameworkを使用しており、キャッシュプロバイダなしで2種類のキャッシュ(インメモリ、Redis)があります。 lack of second-level cache support in EFのため、私たちはそれを自分自身に実装しました。だから私たちのインメモリキャッシュは、キーがキャッシュのIDであり、値がキャッシュされたオブジェクトであるキー値ペアの単純なセットです。また、Redisを使用するために同様のキャッシングを実装しました。クエリでは、メモリ内キャッシュリストを調べ、それが見つからない場合はredisを調べ、存在しない場合はデータベースに対してクエリを実行します。NHibernateの第3レベルのキャッシュ

エンティティフレームワークエンティティはコンテキストを参照しているため、キャッシュにはDbContextのエンティティを使用できません。マップする必要があります。ですから、たくさんのDTOを作成する必要があります。

私はキャッシュがcross-cutting concernであることを知っていますので、よりクリーンなソリューションを探しています。この理由から、最初に私はMemcachedを(単純なリストを使う代わりに)メモリに使うことに決めました。第二に、最も重要なことに、私はSecond-CacheサポートのためにEFからNHibernateに移行するかもしれません。私はそれがfirst level cache is occupied by session objectを知っています。だから私は2番目のレベルのキャッシュのMemcachedを使用したい。しかし、Redisの第3レベルのキャッシュはありますか?

+0

DTOについてプロキシ(DbContextの)でエンティティを使用する際に問題がありますか?通常、問題は、廃棄されたコンテキストにアクセスできないレイジーローダーのためにロードされていない関連プロパティにアクセスしようとするときに発生しますが、分離エンティティで同じ問題が発生します(どちらの場合もIncludeを使用する必要があります)。再びDTOについて私は常にクローンを実装しています(ただし、エンティティに依存します)。 – bubi

+0

@bubi私は永続性フレームワークのドメインモデルを妥協したくありません。 DTOの作成は、Momento Patternのようなものです。次に、私はエンティティフレームワークhas'nt良いキャッシュプロバイダが欲しい。 –

+0

上記の方法でモデルを妥協することはありません。私はあなたがしたと思うが、もしあなたがしなかった場合は、EFの第2レベルのキャッシュ実装を見てみることができます。 Hibernateについて私はあなたの目的がうまくいくかどうか試してみることをお勧めします。古いプロジェクトがまだHibernateにある間は、私はEFを使っています。 Hibernateに関する問題は、クエリを非常に早期に実現する必要があることが多いことです。あなたが頻繁に/いつもうまくいくと思うなら、それはうまくいきますが、DBで作業する必要がある場合は、HQLまたはSQLを書くか、クエリの早い段階でToList()を書く必要があります。 – bubi

答えて

2

多くのDTOを作成せずに第2レベルのキャッシュを実装する方法の1つは、DTOを格納するのではなく、キー値リストにプロパティ名の値リストを使用することです。 私の理解によれば、NHibernateには3次キャッシュはありません。これを行う1つの方法は、Redisで最初に見ることのできるカスタムキャッシュプロバイダを実装し、それが見つからない場合にMemcachedから値を取得することです。

関連する問題