2012-03-29 66 views
1

Ich Abfrage meine NHibernate-Datenquellen mit einem Linq-Ausdruck. Das Problem damit ist, dass keine zwei Aufrufe (oder Bewertungen, Entschuldigung für das schlechte Vokabular) des Ausdrucks jemals in einem Vergleich übereinstimmen. Als Folge führt NHibernate zu oft dieselben SQL mit denselben Parametern aus.NHibernate Caches: Sinnvolle Verwendung, Best Practices?

ich um dieses Problem versendete durch NHibernate Caches verwenden, fließend wie so konfiguriert:

Fluently.Configure().Database(MsSqlConfiguration.MsSql2008 
        .ConnectionString(c => c.Is(cStr)) 
        .ShowSql()) 
        .Mappings(x => x.FluentMappings.AddFromAssemblyOf<MyClassMap>()) 
        .Cache(x=>x.UseQueryCache() 
           .ProviderClass("NHibernate.Cache.HashtableCacheProvider")) 

ich Pflege des Anbieters später stattfinden wird, so dass diese in der Produktion wird am Ende nicht. Als nächstes sind alle meine Fragen bezeichnet als zwischenspeicherbar ist:

session.Query<MyClass>().Cacheable().Where(filter).ToList(); 

Soweit ich read haben, Caching Abfragen im Cache der zweiten Ebene geschieht, die einen Rahmen einer pro-Session hat. Das bedeutet andererseits, dass ich, um meine Anwendungsdaten neu zu laden, die SessionFactory neu installieren müsste, was meiner Ansicht nach viel kostspieliger ist, als dasselbe mit Sitzungen zu tun.

Ist eine effiziente Möglichkeit zum Zwischenspeichern der Abfragen ohne Unordnung (nicht wörtlich, weißt du, was ich meine) mit der SessionFactory?

Antwort

0

Sie können Second-Level-Cache (http://stackoverflow.com/questions/2660714/how-to-clear-the-entire-second-level-cache-in-nibernate) löschen, ohne SessionFactory neu zu erstellen, aber ich bin nicht sicher, dass der bereitgestellte Code auch zwischengespeicherte Abfragen löscht. Und es gibt auch Methoden, um bestimmte Anbieter mit ihrer API zu klären. Aber wie ich weiß, müssen Sie Cache nur manuell löschen, wenn Sie Daten in db manuell ändern (nicht mit NHibernate). Wenn Sie etwas mit NH ändern, wird der Cache selbst aktualisiert. Aber wenn Sie die abgefragten Daten sehr oft ändern, hilft Ihnen der Cache nicht, weil er zu oft aktualisiert werden muss.

+0

Danke für den Link. Nun, nicht manuell, aber schließlich mit der gleichen Konsequenz: Daten werden im gesamten Unternehmen von verschiedenen Computern aus mit jeweils eigenen SessionFactories und Sessions bearbeitet ... wenn ich keine Caches löschen würde, würde ich mit möglicherweise veralteten Objekten arbeiten –

+1

@SebastianEdelmeier verwenden einen verteilten Cache dann –

+0

@DiegoMijelshon beziehen Sie sich auf ein anderes Produkt wie NCache? –