2009-09-15 49 views
1

我目前正在創建一個系統,在某些情況下,如果數據庫不可用,請改用MSMQ。例如。如果應用程序(其中一種情況是wcf Web服務)啓動並且數據庫不可用,則應將所有傳入請求寫入MSMQ。當數據庫再次可用時,請求應該再次寫入數據庫。 我正在使用NHibernate和會話工廠是由一個單身包裹。這是服務的樣子:如果構建Nhibernate會話工廠失敗?

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

這種設置工作在服務啓動並運行了一段時間,會話工廠已經建立。在停止SQL服務器時,會引發ADO異常,並將事情正確寫入MSMQ。

現在我的問題。如果數據庫在第一次啓動服務之前不可用,則無法構建會話工廠並引發TypeInitializationException。我的單身會話提供程序現在已損壞。所以當數據庫再次運行時,我需要一種重建會話工廠的方式。我會做基於計時器的嗎?就像試圖每5分鐘重建一次?我如何「重新實現」一個單身人士?

下面是我使用的會話提供模式的摘錄:

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.你能後的誤差在滿(可能與一個堆棧跟蹤?)。也許nh init錯誤可以解決。 2.您的SessionProvider()會在每次使用sessionFactory時重新創建,如Beatles1692指出的那樣重構。 3.如果發生異常,您的單身人士不會中斷。對於SessionProvider()的每個後續調用,init都會工作,您的應用程序將正常工作 – Jaguar 2010-06-28 06:56:05

回答

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; 
       } 
      } 
...