Asp.Net에서 NHiernate 세션 관리
저자:Eve Cole
업데이트 시간:2009-06-30 16:46:38
NHibernate의 세션은 제가 이해하기로는 데이터베이스 연결과 동등한 것 같습니다. Open/Close 메소드도 있기 때문에 NHibernate의 소스코드를 연구해본 적이 없습니다. 이런 이해가 잘못된 것인지 궁금합니다. Session 관리에 대해 인터넷에서 많이 검색했는데, 대부분 데이터베이스 작업이 필요할 때 OpenSession(), 작업 후에는 CloseSession()이 처음 ADO.NET을 배울 때와 약간 비슷합니다. ) Connection 개체를 호출한 다음 데이터 처리 후 Close()를 수행합니다. 그러나 Connection을 자주 전환하면 시스템 리소스가 소모되기 때문에 단점이 발생합니다. 이전에 데이터 입력 인터페이스를 만들던 때를 기억합니다. 이 입력 인터페이스에는 많은 데이터 요소가 있었고 데이터베이스에서 데이터를 읽고 바인딩하는 데 많은 DropDownList가 필요했기 때문입니다.
이런 방식으로 페이지의 Page_Load에서 해당 개체의 메서드를 하나씩 호출하여 데이터베이스에서 데이터 바인딩 DropDownList를 검색해야 합니다. 왜냐하면 이러한 개체의 메서드는 독립적인 연결을 사용하기 때문입니다. 자신의 연결 열기 및 닫기. 따라서 이 페이지를 여는 데 시간이 오래 걸리고 상대적으로 느립니다. 나중에 DropDownList에 바인딩해야 하는 데이터를 DataSet으로 처리하고 DataSet의 DataTable을 DropDownList에 바인딩했습니다. 이렇게 하면 연결 열기/닫기가 한 번만 필요합니다. 페이지가 훨씬 빨라집니다.
따라서 위의 세션 관리 방식은 그다지 적절하지 않다고 생각됩니다.
나중에 Cuyahoga 오픈 소스 프로젝트에서 그의 세션 관리를 살펴보았는데 그는 "요청당 세션" 모델을 사용했습니다.
문자 그대로 이해하면 요청이 파기될 때까지 각 요청에 대해 세션을 생성한 다음 세션이 닫힙니다.
Cuyahoga의 접근 방식은 각 요청에 대해 CoreRepository 개체를 생성한다는 점에서 요청별 세션과 약간 다릅니다. CoreRepository는 시스템에 필요한 데이터 처리 서비스 클래스입니다.
그가 한 일은 먼저 다음과 같이 CoreRepository 객체를 생성하고 CoreRepository 객체를 파괴하기 위해 HttpModule(NHSessionModule)을 생성하는 것이었습니다.
개인 무효 Context_BeginRequest(개체 전송자, EventArgs e)
{
// Core 객체에 대한 저장소를 생성하고 이를 현재 HttpContext에 추가합니다.
CoreRepository cr = new CoreRepository(true);
HttpContext.Current.Items.Add("CoreRepository", cr);
}
개인 무효 Context_EndRequest(객체 보낸 사람, EventArgs e)
{
// NHibernate 세션을 닫습니다.
if (HttpContext.Current.Items["CoreRepository"] != null)
{
CoreRepository cr = (CoreRepository)HttpContext.Current.Items["CoreRepository"];
cr.CloseSession();
}
}
이런 방식으로 요청이 완료될 때마다 CoreRepository 개체가 자동으로 생성되며, 프로그램의 HttpContext.Current.Items["CoreRepository"]를 통해 CloseSession()을 사용하여 CoreRepository 개체를 얻을 수 있습니다.
이러한 방식으로 NHibernate의 세션은 위장된 형태로 관리되며 "요청당 세션" 모델이 달성됩니다.
자세한 설명: IHttpModule을 구현하여 Nhibernate의 세션을 초기화합니다.
모든 작업에 대해 세션을 생성해야 하는 위의 방법과 비교하면 이 방법은 성능과 속도가 크게 향상됩니다.
그러다가 모든 요청이 세션을 생성한다고 생각했습니다. 연결 풀처럼 세션 풀도 만들 수 있을까요?
이렇게 하면 요청이 있을 때마다 직접 세션을 생성하는 대신 이미 생성된 세션을 세션 풀에서 가져오는 것이 더 효율적이지 않나요? !
http://maplye.cnblogs.com/archive/2006/06/26/435683.html