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