NHibernate - buforowanie
W tym rozdziale omówimy, w jaki sposób cachingdziała w aplikacjach NHibernate. Posiada wbudowaną obsługę buforowania. Wygląda na prostą funkcję, ale w rzeczywistości jest to jedna z najbardziej złożonych funkcji. Zaczniemy od pamięci podręcznej pierwszego poziomu.
Pamięć podręczna pierwszego poziomu
Ten mechanizm pamięci podręcznej jest domyślnie włączony w NHibernate i nie musimy nic robić, aby pracować z pamięcią podręczną. Aby to zrozumieć, spójrzmy na prosty przykład, ponieważ widzisz, że mamy dwa rekordy w naszej bazie danych.
Teraz w tym przykładzie pobieramy ucznia, którego identyfikator to 1 i użyjemy tego samego zapytania sesji dwa razy, jak pokazano w poniższym kodzie.
using HibernatingRhinos.Profiler.Appender.NHibernate;
using NHibernate.Cache;
using NHibernate.Cfg;
using NHibernate.Dialect;
using NHibernate.Driver;
using NHibernate.Linq;
using System;
using System.Linq;
using System.Reflection;
namespace NHibernateDemoApp {
class Program {
static void Main(string[] args) {
NHibernateProfiler.Initialize();
var cfg = new Configuration();
String Data Source = asia13797\\sqlexpress;
String Initial Catalog = NHibernateDemoDB;
String Integrated Security = True;
String Connect Timeout = 15;
String Encrypt = False;
String TrustServerCertificate = False;
String ApplicationIntent = ReadWrite;
String MultiSubnetFailover = False;
cfg.DataBaseIntegration(x = > { x.ConnectionString = "Data Source +
Initial Catalog + Integrated Security + Connect Timeout + Encrypt +
TrustServerCertificate + ApplicationIntent + MultiSubnetFailover";
x.Driver<SqlClientDriver>();
x.Dialect<MsSql2008Dialect>();
x.LogSqlInConsole = true;
x.BatchSize = 10;
});
//cfg.Configure();
cfg.Cache(c => {
c.UseMinimalPuts = true;
c.UseQueryCache = true;
});
cfg.SessionFactory().Caching .Through<HashtableCacheProvider>()
.WithDefaultExpiration(1440);
cfg.AddAssembly(Assembly.GetExecutingAssembly());
var sefact = cfg.BuildSessionFactory();
using (var session = sefact.OpenSession()){
using (var tx = session.BeginTransaction()) {
var studentUsingTheFirstQuery = session.Get<Student>(1);
var studentUsingTheSecondQuery = session.Get<Student>(1);
}
Console.ReadLine();
}
}
}
}
Teraz uruchommy tę aplikację i zobaczmy wynik w NHibernate Profiler.
Będziesz zaskoczony, gdy zobaczysz, że NHibernate odpala tylko jedno zapytanie. W ten sposób NHibernate wykorzystuje pamięć podręczną pierwszego poziomu. Kiedy pierwsze zapytanie jest wykonywane, NHibernate buforuje Studenta o ID = 1 w swojej pamięci podręcznej pierwszego poziomu.
Tak więc, po wykonaniu drugiego zapytania NHibernate najpierw wyszukuje pamięć podręczną pierwszego poziomu Jednostka studenta o identyfikatorze = 1, jeśli znajdzie tę jednostkę, to NHibernate wie, że nie ma potrzeby uruchamiania kolejnego zapytania w celu ponownego pobrania tego samego obiektu pracownika .