2009-09-15 5 views
1

현재 데이터베이스를 사용할 수없는 경우 대신 MSMQ를 사용하는 경우가 있습니다. 예 : 응용 프로그램 (wcf 웹 서비스 중 하나)이 시작되고 데이터베이스를 사용할 수없는 경우 들어오는 모든 요청을 MSMQ에 기록해야합니다. 데이터베이스를 다시 사용할 수있게되면 요청을 다시 db에 기록해야합니다. NHibernate를 사용하고 있고 세션 팩토리가 싱글 톤으로 싸여있다. 이 서비스는 다음과 같습니다.Nhibernate 세션 팩토리를 작성하는 데 실패하면 어떻게됩니까?

try 
{ 
    // to database (just an example) 
    SessionProvider.Current.CurrentSession.Save...  
} 
catch(NHibernate.ADOException) 
{ 
    // to msmq 
} 

이 설정은 서비스가 작동되고 세션 팩토리가 빌드되었을 때 작동합니다. SQL 서버를 중지 할 때 ADO 예외가 발생하고 MSMQ에 문제가 올바르게 기록됩니다.

이제 내 문제. 서비스를 처음 시작하기 전에 데이터베이스를 사용할 수없는 경우 세션 팩터 리를 빌드 할 수 없으며 TypeInitializationException이 발생합니다. 내 싱글 톤 세션 공급자가 고장났습니다. 그래서 데이터베이스가 다시 돌아 오면, 나는 어떻게 든 세션 팩토리를 재 구축 할 방법이 필요하다. 그 타이머를 기반으로할까요? 5 분마다 재건하려고하는 것처럼? 싱글 톤을 어떻게 reinstantiate 수 있습니까?

public sealed class SessionProvider : ISessionProvider 
{ 
    private ISessionFactory sessionFactory; 

    private SessionProvider() 
    { 
     sessionFactory = new Configuration().Configure().BuildSessionFactory(); 
    } 

    public static ISessionFactory SessionFactory 
    { 
     get 
     { 
      return Nested.SessionProvider.sessionFactory; 
     } 
    } 

    public static ISessionProvider Current 
    { 
     get 
     { 
      // TypeInitializationException is thrown when building session factory fails 
      return Nested.SessionProvider;         
     } 
    } 

    private class Nested 
    { 
     internal static readonly SessionProvider SessionProvider = new SessionProvider(); 
    } 
} 
+1

1. 전체에 오류를 게시 할 수 (아마 여기

내가 사용하고있는 세션 제공 패턴의 발췌입니다 stacktrace?). 어쩌면 nh 초기화 오류를 해결할 수 있습니다. 2. SessionProvider()는 sessionFactory를 사용할 때마다 다시 작성하며, Beatles1692가 지적한대로 리팩토링합니다. 3. 예외가 발생하면 싱글 톤이 손상되지 않습니다. SessionProvider()를 호출 할 때마다 init이 작동하여 응용 프로그램이 제대로 작동합니다. – Jaguar

답변

1

난 당신이처럼 SessionProvider를 변경 제안 :

...  
     private ISessionFactory sessionFactory; 
     private Configuration config; 

      private SessionProvider() 
      { 
       config= new Configuration(); 
       config.Configure(); 
      } 


     public static ISessionFactory SessionFactory 
      { 
       get 
       { 
        if(sessionFactory==null) 
         sessionFactory=config.BuildSessionFactory(); 

         return Nested.SessionProvider.sessionFactory; 
       } 
      } 
... 
관련 문제