2009-10-01 6 views

Antwort

31

Ich habe eine ähnliche Situation gearbeitet, in der ich nur bestimmte Elemente zwischenspeichern möchte und möchte, dass diese Elemente beim Start einmal geladen und im Cache gehalten werden, bis die Anwendung heruntergefahren wird. Dies ist ein schreibgeschützter Cache und wird zum Auffüllen einer Liste von Ländern verwendet, so dass ein Benutzer sein Land aus der Liste auswählen kann.

benutzte ich FluentNHibernate Mappings und definiert Land meiner Klasse mit Cache.readonly()

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

Karte Mein Benutzerklasse wie folgt aussieht:

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"); 
} 

I Fluent NHibernate verwenden Zweite manuell konfigurieren Level-Cache. Also in meinem fließend Confuguration ich habe:

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(); 

ich in SQL Profiler überprüft habe, und wenn ich eine Liste des countrys für einen Benutzer zu erhalten, werden die einmal geladen, und ich Cache-Treffer nach jeder anderen Anfrage. Das Schöne daran ist, dass beim Anzeigen des Ländernamens des Benutzers dieser aus dem Cache geladen wird und keine Anfrage an die Datenbank gestellt wird. Ich habe ein paar Tipps von diesem Beitrag von Gabriel Schenker bekommen. Ich hoffe, das hilft? Wenn Sie einen besseren/richtigen Weg gefunden haben, lassen Sie es mich bitte wissen. Vielen Dank!

+0

Gute Antwort! Ich habe getan, was du erfolgreich gemacht hast. Ich bevorzuge Ayendes NhProf für das Profiling, viel besser als SQL Profiler, aber es ist nicht kostenlos (es gibt eine Testversion) und es ist NHibernate-spezifisch. –

+0

Yip, ich habe einige Screenshots von NHProf gesehen, sieht gut aus. Könnte es versuchen, bevor wir live gehen. –

+0

Ich benutze jetzt nhprof! es ist eine große Hilfe! –