2015-11-12 28 views
10

Il nostro progetto utilizza Entity Framework e dispone di 2 tipi di cache (in memoria, Redis) senza alcun provider di cache. A causa di lack of second-level cache support in EF, l'abbiamo implementato noi stessi. Quindi la nostra cache in memoria è un semplice insieme di coppie di valori chiave dove la chiave è l'id della cache e il valore è l'oggetto memorizzato nella cache. Abbiamo anche implementato il caching simile per usare Redis. Per la query, guardiamo l'elenco di cache in memoria e, se non lo è, guardiamo a redis e, se non ci sono, interrogiamo il database.cache di terzo livello per NHibernate

Poiché le entità della struttura dell'entità fanno riferimento al contesto, non è possibile utilizzare l'entità di DbContext nella cache e occorre mapparla. Quindi abbiamo bisogno di creare molti DTO.

So che la cache è cross-cutting concern quindi cerco una soluzione più pulita. Per questo motivo, per prima cosa decido di usare Memcached per In-Memory (invece di usare una lista semplice). Come seconda cosa e, cosa più importante, potrei migrare da EF a NHibernate per il suo supporto di Second-Cache. So che first level cache is occupied by session object. Quindi voglio usare Memcached per la cache di secondo livello. Ma c'è qualche cache di terzo livello per Redis?

+0

Informazioni sui DTO Problemi nell'utilizzo di entità con proxy (di DbContext)? Solitamente i problemi sorgono quando si tenta di accedere alle proprietà correlate non caricate a causa del caricatore pigro che non può accedere a un contesto disposto ma si ha lo stesso problema con entità distaccate (in entrambi i casi è necessario utilizzare Includi). Di nuovo su DTO implemento sempre Clone iniziando ad implementare un clone poco profondo (ma dipende dall'entità) ed è spesso (sempre) una copia dei valori dei campi (usando una funzione personalizzata simile a MemberwiseClone ma non MemberwiseClone altrimenti si ha di nuovo l'intero proxy). – bubi

+0

@bubi Non voglio compromettere il mio modello di dominio per il framework di persistenza. La creazione di DTO è qualcosa come Momento Pattern. In secondo luogo voglio un buon fornitore di cache che il framework di entità non abbia. –

+0

Non compromettere il modello usando l'approccio sopra. Penso che l'hai fatto, ma se non lo facessi potresti dare un'occhiata alle implementazioni della cache di secondo livello per EF. Informazioni su Hibernate Ti suggerisco di provare se per il tuo scopo funziona bene. Posso dire che ora (per i nuovi progetti) sto usando EF mentre i vecchi progetti sono ancora in Hibernate. Il problema di Hibernate è che spesso è necessario materializzare le query molto presto. Se pensi di lavorare spesso in memoria/funziona sempre bene, ma se hai bisogno di lavorare su DB a volte devi scrivere HQL o SQL (o inserire ToList() nelle prime fasi della query). – bubi

risposta

2

Un modo per implementare una cache di secondo livello senza creare molti DTO è utilizzare la lista valori nome proprietà in un elenco valori chiave invece di memorizzare un DTO. Secondo quanto ho capito, non ci sono cache di terzo livello in NHibernate. Un modo per farlo è implementare un provider di cache personalizzato che potrebbe prima cercare in Redis e, se non riesce a trovarlo, ottenere i valori da Memcached.