2015-11-12 3 views
10

Unser Projekt verwendet Entity Framework und hat 2 Arten von Cache (In-Memory, Redis) ohne Cache-Provider. Aufgrund lack of second-level cache support in EF haben wir es selbst implementiert. Unser In-Memory-Cache ist also ein einfacher Satz von Schlüsselwertpaaren, wobei Schlüssel die ID des Caches und Wert das zwischengespeicherte Objekt ist. Wir haben auch ein ähnliches Caching implementiert, um Redis zu verwenden. Für die Abfrage schauen wir uns die In-Memory-Cache-Liste an und wenn es nicht so ist, schauen wir uns redis an und wenn es nicht dort ist, fragen wir gegen die Datenbank ab.Third-Level-Cache für NHibernate

Da Entitäts-Framework-Entitäten einen Verweis auf den Kontext haben, können wir die Entität DbContext beim Caching nicht verwenden, und wir müssen sie zuordnen. Also müssen wir eine Menge DTOs erstellen.

Ich weiß, dass Cache cross-cutting concern ist, also suche ich nach sauberer Lösung. Aus diesem Grund entscheide ich mich zuerst, Memcached für In-Memory zu verwenden (anstatt einfache Liste zu verwenden). Als zweites und am wichtigsten kann ich von EF nach NHibernate für seine Second-Cache-Unterstützung migrieren. Ich weiß das first level cache is occupied by session object. Daher möchte ich Memcached für den Cache der zweiten Ebene verwenden. Aber gibt es einen dritten Cache für Redis?

+0

Über DTOs haben Sie Probleme mit Entitäten mit Proxy (von DbContext)? Normalerweise treten die Probleme auf, wenn Sie versuchen, auf verwandte Eigenschaften zuzugreifen, die aufgrund des Lazy Loader nicht geladen wurden und nicht auf einen entsorgten Kontext zugreifen können. Sie haben jedoch das gleiche Problem mit getrennten Entitäten (in beiden Fällen müssen Sie Include verwenden). Wiederum über DTO implementiere ich immer Clone mit der Implementierung eines flachen Klons (aber es hängt von der Entität ab) und ist oft (immer) eine Feldwertekopie (mit einer benutzerdefinierten Funktion ähnlich wie MemberwiseClone, aber nicht MemberwiseClone, sonst hast du wieder den ganzen Proxy). – bubi

+0

@bubi Ich möchte mein Domain-Modell für Persistenz-Framework nicht kompromittieren. Das Erstellen von DTOs ist etwas wie Momento Pattern. Zweitens möchte ich einen guten Cache-Provider, den Entity-Framework nicht hat. –

+0

Sie können das Modell nicht mit dem obigen Ansatz kompromittieren. Ich denke, du hast es getan, aber wenn du es nicht getan hättest, könntest du einen Blick auf Second-Level-Cache-Implementierungen für EF werfen. Über Hibernate Ich schlage vor, Sie zu versuchen, wenn für Ihren Zweck gut funktioniert. Ich kann sagen, dass ich jetzt (für neue Projekte) EF verwende, während sich alte Projekte noch im Hibernate befinden. Das Problem mit Hibernate besteht darin, dass Sie Abfragen oft sehr früh materialisieren müssen. Wenn Sie denken, oft im Speicher zu arbeiten, funktioniert es immer gut, aber wenn Sie mit DB arbeiten müssen, müssen Sie manchmal HQL oder SQL schreiben (oder früh in die Abfrage ToList() einfügen). – bubi

Antwort

2

Eine Möglichkeit, einen Cache der zweiten Ebene zu implementieren, ohne viele DTOs zu erstellen, besteht darin, die Werteliste für Eigenschaftsnamen in einer Schlüsselwerteliste zu verwenden, anstatt ein DTO zu speichern. Nach meinem Verständnis gibt es in NHibernate keinen Cache der dritten Ebene. Eine Möglichkeit, dies zu tun, besteht darin, einen benutzerdefinierten Cache-Provider zu implementieren, der zuerst in die Redis schauen kann und, wenn er es nicht findet, dann Werte aus dem Memcached erhält.

Verwandte Themen