2009-10-01 4 views

risposta

31

Ho lavorato a una situazione simile, in cui voglio solo memorizzare nella cache elementi specifici, e voglio che questi elementi vengano caricati una volta all'avvio e conservati nella cache, fino a quando l'applicazione non viene chiusa. Questa è una cache di sola lettura e viene utilizzata per popolare un elenco di paesi, in modo che un utente possa selezionare il proprio paese dall'elenco.

ho usato fluentNhibernate Mapping, e definito Paese mia classe con Cache.readonly()

public class CountryMap : ClassMap<Country> { 
    public CountryMap() { 
     Schema("Dropdowns"); 
     Cache.ReadOnly(); 
     // Class mappings underneath 
    } 
} 

La mia mappa classe utente si presenta così:

public class UserMap : ClassMap<User> { 
    Id(x => x.Id).Column("UserId"); 
    Map(x => x.FirstName); 
    Map(x => x.LastName); 
    References(x => x.Country) 
     .Column("CountryId"); 
} 

ho manualmente configurare Fluent NHibernate da usare Second cache di livello. Così nel mio Confuguration fluente ho:

var sessionFactory = Fluently.Configure() 
    .Database (...) // set up db here 
    .Mappings(...) //set up mapping here 
    .ExposeConfiguration(c => { 
     // People advice not to use NHibernate.Cache.HashtableCacheProvider for production 
     c.SetProperty("cache.provider_class", "NHibernate.Cache.HashtableCacheProvider"); 
     c.SetProperty("cache.use_second_level_cache", "true"); 
     c.SetProperty("cache.use_query_cache", "true"); 
    }) 
    .BuildSessionFactory(); 

Ho controllato in SQL Profiler, e quando ho un elenco di countrys per un utente, l'vengono caricati una volta, e ho la cache colpisce dopo ogni altra richiesta. La cosa bella è che durante la visualizzazione del nome del paese dell'utente, viene caricato dalla cache e non effettua una richiesta al database. Ho ricevuto alcuni suggerimenti da questa pubblicazione entro il Gabriel Schenker. Spero possa aiutare? Se hai trovato un modo migliore/corretto, per favore fatemelo sapere? Grazie!

+0

Buona risposta! Ho fatto anche quello che hai fatto con successo. Preferisco il NhProf di Ayende per la profilazione, molto meglio di SQL profiler, ma non è gratuito (c'è una versione di prova) ed è specifico di NHibernate. –

+0

Sì, ho visto alcuni screenshot di NHProf, sembra buono. Potresti provare prima di andare a vivere. –

+0

Ora uso nhprof! è un grande aiuto! –