2010-12-07 5 views
6

나는 Fluent NHibernate를 사용하고 있는데, 나는 그것을 좋아한다! 약간의 문제가 있습니다 : 시작 시간이 약 10 초이고 Fluent nHibernate를 최적화하는 방법을 모르겠다 이 시작 시간을 덜 문제가되게 만들려면 스레드에 넣으십시오.유창한 nHibernate 느린 시작 시간

누군가 해결책을 말씀해 주시겠습니까? 그리고 성능 개선을 위해 수정 된 코드로 답하십시오.

다음과 같은 것을 보았습니다 : http://nhforge.org/blogs/nhibernate/archive/2009/03/13/an-improvement-on-sessionfactory-initialization.aspx Fluent nHibernate와 함께이 작업을 수행하는 방법을 모르겠다.

내 코드는 다음과 같다 : 당신은 한 번만 구성을 구축 할 필요가

public static ISession ObterSessao()   
{ 
     System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Highest; 

     string ConnectionString = ConfigurationHelper.LeConfiguracaoWeb("EstoqueDBNet"); // My Connection string goes here 

     var config = Fluently.Configure() 
      .Database(FluentNHibernate.Cfg.Db.MySQLConfiguration.Standard.ConnectionString(ConnectionString)); 

     config.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())); 

     var session = config 
      .BuildSessionFactory() 
      .OpenSession(); 

     System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Normal; 

     return session; 
    } 

답변

2

필이 정답을 가지고 있지만 더 http://nhibernate.info/blog/2009/03/13/an-improvement-on-sessionfactory-initialization.html 살펴보고 그것을 조금 걸릴 NHibernate 설정을 파일로 직렬화하기 때문에, 앱을 시작할 때마다 다시 빌드 할 필요가 없습니다. 이것은 여러 가지 요소 (주로 매핑 수)에 따라 조금 더 빨라질 수도 있고 그렇지 않을 수도 있습니다. - Is there any data on NHibernate vs Fluent NHibernate startup performance?

(답변 - 의견의 몇 가지 질문에 따라) SessionFactory가 아닌 (NHibernate.Cfg.) Configuration 객체를 직렬화해야한다.

그런 다음 FluentConfiguration을 만들 때 (자동으로 구성하지 않고) 구성을 주입하려면 Fluently.Configure(Configuration cfg) 오버로드를 사용합니다.

+0

예! 그것이 내가 누락 한 한 가지 점이다. Fluently.Configure (Configuration cfg); 이 질문을 끝내기 위해서 나는 또 다른 요점이 필요하다고 생각한다. 역순 어떻게 하는가? Fluent nHibernate에서 NHibernate.Cfg.Configuration에 접근 하는가? 이것으로 직렬화와 비 직렬화를 할 수 있습니다. – Tony

+0

나는 이것을하려고 노력하고있다. 직렬화를 통해 저장하기위한 구성을 얻는이 단계에서이 오류가 발생했습니다 : 암시 적으로 'FluentNHibernate.Cfg.FluentConfiguration'형식을 'NHibernate.Cfg.Configuration'으로 변환 할 수 없습니다. – Tony

+1

안녕하세요! 그것은 효과가 있었다. 나는이 작업을 역순으로 사용했다 : NHibernate.Cfg.Configuration cfg = config.BuildConfiguration(); // 설정은 FluentConfiguration – Tony

5

. 현재 세션을 생성 할 때마다 새로운 구성을 구축하고 있습니다.

+1

안녕하세요, 어떻게 config 개체를 파일에 저장할 수 있습니까? 다시 프로그램을 실행할 때 읽을 수 있습니다. (Deserialize) 프로그램을 빨리 시작하십시오. 위의 코드에서 config 객체를 serialize하려했으나 다음과 같이 반환했습니다. Tony

+0

코드를 정적 생성자에 넣고 SessionFactory를 ISessionFactory를 반환하는 정적 속성에 할당 할 수 있습니다. 그런 다음 obtersesao.OpenSession()을 호출하십시오. – Phill

+0

Factory에 파일을 저장 (Serialize)하고 나중에 복원 할 수 있습니까? 내 응용 프로그램은 실행 파일이므로 사용자가 실행할 때마다 10 초 지연됩니다. – Tony

2

우선 무엇보다 스레드 우선 순위를 망치지 마십시오.

둘째, Phill이 말한 것처럼 SessionFactory를 캐시해야하거나 세션 개체가 필요할 때마다 구성을 다시 작성해야합니다.

당신은 같은 것을 할, 또는 클래스로 if의 코드를 이동할 수있는 '정적 생성자 :

private static SessionFactory _factory = null; 
public static ISession ObterSessao()   
{ 
    if(_factory == null) { 
     string ConnectionString = ConfigurationHelper.LeConfiguracaoWeb("EstoqueDBNet"); // My Connection string goes here 

     var config = Fluently.Configure() 
      .Database(FluentNHibernate.Cfg.Db.MySQLConfiguration.Standard.ConnectionString(ConnectionString)); 

     config.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())); 

     _factory = config.BuildSessionFactory(); 
    } 

    return _factory.OpenSession(); 
} 
+0

어떻게이 _factory 파일 (Serialize) 저장할 수 내 사용자가 응용 프로그램을 다시 파일을 읽고 _factory 복원 (Deserialize) _factory? 문제는 팩토리 생성과 클라이언트 시스템에서 실행되는 응용 프로그램이므로 사용자가 누를 때마다 약 10 초 지연됩니다. – Tony

+0

@ 토니, 사용자가 무언가를 클릭 할 때마다 10 초 지연이 있으면 문제가 유창한 구성이 아니므로 어딘가에 있어야합니다. SessionFactory를 캐싱하면 애플리케이션을 시작하는 동안 매핑 오버 헤드가 한 번 발생한다. 시작시에만 10 초 동안 지연됩니까? – joshperry