NHibernate - Bộ nhớ đệm
Trong chương này, chúng tôi sẽ đề cập đến cách cachinghoạt động trong các ứng dụng NHibernate. Nó có hỗ trợ tích hợp cho bộ nhớ đệm. Nó trông có vẻ như là một tính năng đơn giản, nhưng trên thực tế, nó là một trong những tính năng phức tạp nhất. Chúng ta sẽ bắt đầu với Bộ nhớ đệm cấp độ đầu tiên.
Bộ nhớ đệm cấp độ đầu tiên
Cơ chế bộ nhớ cache này được kích hoạt theo mặc định trong NHibernate và chúng tôi không cần phải làm gì để làm việc với bộ nhớ cache. Để hiểu điều này, chúng ta hãy xem xét một ví dụ đơn giản, như bạn có thể thấy rằng chúng tôi có hai bản ghi trong cơ sở dữ liệu của mình.
Bây giờ trong ví dụ này, chúng tôi sẽ truy xuất sinh viên có ID là 1 và chúng tôi sẽ sử dụng cùng một truy vấn phiên hai lần như được hiển thị trong đoạn mã sau.
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();
}
}
}
}
Bây giờ hãy chạy ứng dụng này và xem kết quả trong NHibernate Profiler.
Bạn sẽ ngạc nhiên khi thấy NHibernate chỉ kích hoạt một truy vấn. Đây là cách NHibernate sử dụng bộ nhớ cache cấp đầu tiên. Khi truy vấn đầu tiên được thực thi, sau đó NHibernate đã lưu vào bộ nhớ cache của Sinh viên có ID = 1 trong bộ nhớ cache cấp đầu tiên của nó.
Vì vậy, khi truy vấn thứ hai được thực thi thì trước tiên NHibernate tìm kiếm thực thể Student trong bộ đệm ẩn cấp đầu tiên với ID = 1, nếu nó tìm thấy thực thể đó, thì NHibernate biết điều đó, không cần phải kích hoạt một truy vấn khác để lấy lại cùng một đối tượng nhân viên .