NHibernate는 인기 있는 ORM(Object-Relational Mapping) 프레임워크입니다. .NET 애플리케이션, 객체 지향 코드를 통해 원활한 데이터베이스 상호 작용을 가능하게 합니다. 그러나 애플리케이션이 대량의 트랜잭션 로드를 처리할 때 빈번한 데이터베이스 쿼리로 인해 성능 병목 현상이 발생하는 경우가 많습니다.
이를 해결하기 위해 NHibernate는 2차 캐싱을 제공합니다. 이는 객체를 애플리케이션 수준의 메모리에 보관하여 데이터베이스에 반복적으로 액세스할 필요성을 줄여줍니다. NCache매우 빠르고 확장 가능한 분산 캐시로서 다음과 같은 역할을 합니다. NHibernate 2차 캐시 애플리케이션 속도, 확장성, 안정성을 크게 향상시키는 공급업체입니다.
NCache NHibernate용 고성능 분산형 2차 캐시(L2)를 제공하여 .NET 애플리케이션의 데이터베이스 병목 현상을 제거합니다. 선형 확장성을 제공하며, P2P 클러스터링을 통해 100% 가동 시간을 보장하고, 통합을 위해 코드 변경이 전혀 필요하지 않습니다.
NCache 아래 설명된 대로 NHibernate를 더 빠른 쿼리, 줄어든 데이터베이스 부하, 높은 가용성으로 향상시킵니다.
| 제품 특장점 | NHibernate L1(세션 캐시) | NCache (분산형 L2 캐시) |
|---|---|---|
| 범위 및 격리 | 트랜잭션 범위로 제한됩니다. 데이터는 단일 트랜잭션에 격리됩니다. ISession 목적. | 프로세스 전체/클러스터 전체에 걸쳐 데이터가 공유됩니다. 웹 팜 내의 모든 세션과 모든 서버에서 데이터가 공유됩니다. |
| 데이터 지속성 | 일시적인 객체입니다. 세션이 종료되거나 요청이 끝나면 객체는 즉시 소멸됩니다. | 영구 메모리 저장. 데이터는 애플리케이션 재시작이나 세션 종료와 관계없이 캐시 클러스터에 저장됩니다. |
| 확장성 | 처리 중인 프로세스 내에서만 사용 가능합니다. 단일 웹 서버의 메모리 용량에 제한되며, 웹 서버 팜 전체에서 공유할 수 없습니다. | 선형 확장성. 캐시 서버를 동적으로 추가하여 저장 용량과 처리량을 늘릴 수 있습니다. |
| 데이터베이스 동기화 | 없음. L1에는 다른 프로세스가 데이터베이스를 업데이트했는지 알 수 있는 메커니즘이 없습니다. | 자동 동기화. 사용 SqlCacheDependency오라클 종속성 또는 폴링을 사용하여 오래된 데이터를 무효화할 수 있습니다. |
| 쿼리 캐싱 | 해당 사항 없음 (L1은 주로 ID 기반 조회를 위한 것입니다). | 지원됩니다. 복잡한 쿼리 결과를 캐시하여 비용이 많이 드는 SQL 실행을 반복적으로 수행하지 않도록 합니다. |
다음은 몇 가지 주요 기능입니다. NCache NHibernate 사용자에게 제공:
<configuration>
<application-config application-id="myapp"
enable-cache-exception="true"
default-region-name="default"
key-case-sensitivity="false" >
<cache-regions>
<region name="AbsoluteExpirationRegion"
cache-name="demoCache"
priority="Default"
expiration-type="sliding"
expiration-period="180" />
<region name="default"
cache-name="demoCache"
priority="default"
expiration-type="none"
expiration-period="0"/>
</cache-regions>
</application-config>
</configuration>
<configuration>
<application-config application-id="myapp"
enable-cache-exception="true"
default-region-name="default"
key-case-sensitivity="false">
<database-dependencies>
<dependency entity-name="nhibernator.BLL.Customer"
type="sql"
sql-statement="SELECT ContactName FROM dbo.Customers WHERE CustomerID =?"
cache-key-format="dependency.customer: [us]"/>
</database-dependencies>
</application-config>
</configuration>
이 예제에서는 NHibernate 쿼리 캐싱을 활성화하는 방법을 보여줍니다. NCache 성능 향상을 위해 쿼리 결과를 저장하고 재사용합니다.
using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
IQuery query = session.CreateQuery("FROM Customer c")
.SetCacheable(true);
var customers = await query.ListAsync<Customer>();
var newCustomer = new Customer { Name = "John Doe" };
await session.SaveAsync(newCustomer);
await session.FlushAsync();
transaction.Commit();
}
}
Install-Package NHibernate.NCache
NHibernate 구성 파일을 수정하여 활성화하세요. NCache 2차 캐시 제공자로서.
hibernate.cfg.xml 업데이트
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="cache.provider_class">
Alachisoft.NCache.Integrations.NHibernate.Cache.NCacheProvider,
Alachisoft.NCache.Integrations.NHibernate.Cache
</property>
<property name="cache.use_second_level_cache">true</property>
</session-factory>
</hibernate-configuration>