2014-12-17 10 views
6

Utilizziamo NHibernate 4 nella nostra applicazione asp.net mvc 4 (.net 4). Per quanto posso dire il comportamento di NHibernate 4 è cambiato un po 'quando si tratta di cache di secondo livello.NHibernate 4: uso della cache di secondo livello per le raccolte figlio a carico lento

il seguente comportamento sembra aver cambiato (per favore correggetemi se sbaglio):

  • Non v'è più un'operazione necessaria quando si utilizza la cache di secondo livello
  • Quando eseguo una query come (Hibsession .Query(). Dove (x => x.Name == "x"). ToList()), quindi eseguirà una query per l'entità corrispondente. Nelle precedenti versioni di NHibernate - se ricordo correttamente - sarebbero stati recuperati solo gli id ​​dell'entità.

Mi sembra che di secondo livello si applica solo nei casi seguenti:

using (var hibSession = SessionFactory.OpenSession()) 
{ 
    // Second level cache working 
    var entity = hibSession.Get<ChachedEntity>(7); // second level cache working 
    var parent = entity.ParentElement; // second level cache working because n:1 

    // Probably working (not tested) 
    var elements = hibSession.Query<ChachedEntity>().Cacheable().Take(30).ToList(); // guessed behaviour: query-cache selects id's and then then uses second level cache 

    // second level cache NOT Working 
    var children = entity.ChildCollectionWithCachableEntities; // second level cache NOT working because 1:n (!!) 
} 

Le mie domande sono ora:

  • Dove è il comportamento della cache di secondo livello NHibernate 4 descritto (o almeno modifiche alla versione 3 documentate)
  • È possibile utilizzare la cache di secondo livello per gli elementi figlio di caricamento lento? (O almeno garantire che solo i id vengono caricate e poi la seconda cache di livello materializzano entità)

Grazie in anticipo

risposta

0

transazioni sono ancora necessari. Se non li si utilizza, la cache verrà disattivata non appena si avvia l'aggiornamento di alcune entità memorizzate nella cache. (See here as for why, mi sono morso di recente con l'ultima versione NH. Perché ho trascurato transazione? No scusa ... Avendo inoltre read committed snapshot attivato in SQL Server che elimina situazioni di stallo che coinvolgono di sola lettura query read-committed.)

opere Collezione di caching , ma deve essere configurato nella mappatura della collezione. Aggiungi un nodo <cache usage="..." /> ai set e ad altre raccolte che devono essere memorizzate nella cache. Le loro entità contenute devono essere memorizzabili nella cache perché ciò sia effettivamente utile. (Raccolta nella cache solo chiavi principali delle entità correlate alle cache.)

Sul meccanismo di query che carica solo ID dal DB se la query è memorizzabile nella cache, non l'ho mai visto, sebbene io sia un utente di lunga data di NHibernate. (Lo sto utilizzando dalla versione 0.9, era già molto maturo e ricco di funzionalità.) Per quanto ne so, non ci sono stati cambiamenti seri nella cache di secondo livello con NH 4. È possibile controllare il loro issues and changes tracker.