2009-08-18 3 views
0

그냥 유창와 NHibernate에 학습, 내 세션 제공자는 다음과 같습니다 내 세션 객체를 얻고되는 방법이 세션 공급자가 웹에 맞습니까?

public class SessionProvider 
    { 

     private static ISessionFactory sessionFactory; 

     public static ISessionFactory SessionFactory 
     { 
      get 
      { 
       if (sessionFactory == null) 
       { 
        sessionFactory = Fluently.Configure() 
         .Database(MsSqlConfiguration.MsSql2005.ConnectionString(c => c.FromAppSetting("sqlserver"))) 
         .Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMapping>()) 
         .BuildSessionFactory(); 
       } 

       return sessionFactory; 
      } 
     } 

     private SessionProvider() 
     { } 

     public static ISession GetSession() 
     { 
      return SessionFactory.OpenSession(); 
     } 
    } 

이인가? 트래픽이 많은 웹 사이트에서이 작업을 수행하는 '가장 빠른'방법입니까?

답변

0

"가장 빠름"은 전체 앱주기에 대해 1 세션을 유지하는 것일 뿐이지 만 이는 또한 어리석은 일입니다. P (요즘 멀티 코어에서는 가장 빠르다고 확신하지 못합니다).

모두 괜찮아 보입니다. GetSession()이 각 호출에 대해 새 세션을 엽니 다. 개인적으로, 나는 "단지를 (개방, 폐쇄, 더러운?) 일명 HttpRequest를 당 1 개 세션 :

public static ISession GetSession() 
{ 
    if (HttpContext.Current.Items[SESSION_KEY] == null) 
    { 
     HttpContext.Current.Items[SESSION_KEY] = SessionFactory.OpenSession(); 
    } 
    return HttpContext.Current.Items[SESSION_KEY] as ISession; 
} 
private const string SESSION_KEY = "kahsdmiashdohbasduhfasduybadsubdsabsd"; 

또한 세션의 상태에 검사를 할 수를 유지하고, 그에 따라 행동 대신에 좋아 게으른 초기화 ".

[편집] BTW, 귀하의 클래스 (개인 생성자, 모든 정적 멤버) 인스턴스화하고 싶지 않아 것 같습니다. 클래스를 정적으로 선언해야합니다. public static class MyClass{}. 그러면 클래스에 비 정적 멤버가 포함될 수없고 인스턴스화 될 수 없게됩니다.

0

여기에 보조 노트가 NHibernate에 개발자들 중 하나에 의해 새로운 세션을 생성하는 비용에 대한 짧은 포스트이기 때문에 (스포일러 : 그것은 저렴)

What is the cost of opening a session

+0

는하지만 구성을 설정하는 것은 고가의 전화입니다 권리? – mrblah

+0

그래, 공장을 짓는 데 몇 초가 걸릴 수 있습니다. 당신은 그 일을 한 번 이상하고 싶지 않습니다 :) – cwap