NHibernate-캐싱
이 장에서는 cachingNHibernate 응용 프로그램에서 작동합니다. 캐싱을 기본적으로 지원합니다. 단순한 기능으로 보이지만 실제로는 가장 복잡한 기능 중 하나입니다. 첫 번째 수준 캐시부터 시작하겠습니다.
첫 번째 수준 캐시
이 캐시 메커니즘은 NHibernate에서 기본적으로 활성화되어 있으며 캐시 작업을 위해 아무것도 할 필요가 없습니다. 이를 이해하기 위해 데이터베이스에 두 개의 레코드가 있음을 알 수 있듯이 간단한 예를 살펴 보겠습니다.
이제이 예제에서는 ID가 1 인 학생을 검색하고 다음 코드와 같이 동일한 세션 쿼리를 두 번 사용합니다.
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();
}
}
}
}
이제이 응용 프로그램을 실행하고 NHibernate Profiler에서 결과를 봅니다.
NHibernate가 하나의 쿼리 만 실행한다는 사실에 놀랄 것입니다. 이것이 NHibernate가 첫 번째 레벨 캐시를 사용하는 방법입니다. 첫 번째 쿼리가 실행되면 NHibernate는 첫 번째 수준 캐시에 ID = 1 인 Student를 캐시했습니다.
따라서 두 번째 쿼리가 실행될 때 NHibernate는 먼저 ID = 1 인 첫 번째 레벨 캐시 Student 엔티티를 조회하고 해당 엔티티를 찾으면 NHibernate는 동일한 직원 객체를 다시 검색하기 위해 다른 쿼리를 실행할 필요가 없음을 알고 있습니다. .