2016-01-21 57 views
0

我一直在爲這個錯誤奮鬥了一個多月,無法想象它。網站偶爾失去與數據庫的連接

背景/建築:

  • MVC 4應用
  • NHibernate的
  • FluentNHibernate
  • SQL Server 2008 R2的
  • Azure的網站

偶爾救援人員到場

NHibernate.Exceptions.GenericADOException:無法初始化 集合:[WrestleStat.BL.School ughout的日子,因爲當他們試圖在我的對象讀取/顯示屬性,它說我的意見引發錯誤.Schedule#54] [SQL:SELECT ...(刪除以保持這個簡短)....] ---> System.Data.SqlClient.SqlException:超時過期。在操作完成之前已經過去的時間段爲 ,或者服務器爲 未響應。嘗試連接到路由目標的 時發生此故障。嘗試連接到原始服務器的 花費的持續時間爲 - [Pre-Login] initialization = 3; handshake = 23; [登錄]初始化= 0;認證= 0; [登錄後] complete = 1; ---> System.ComponentModel.Win32Exception:等待 操作超時 ---內部異常堆棧跟蹤結束---在System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 異常,Boolean breakConnection,Action`1 wrapCloseInAction)在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布爾callerHasConnectionLock,布爾asyncClose)在 System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj,UInt32的誤差)在 System.Data.SqlClient的.TdsParserStateObject.ReadSniSyncOverAsync()at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()at System.Data.SqlClient.TdsParserStateObject.T ryPrepareBuffer()在 System.Data.SqlClient.TdsParserStateObject.TryReadByteArray(字節[] 拋光輪,的Int32偏移的Int32 LEN,的Int32 & totalRead)在 System.Data.SqlClient.TdsParserStateObjec

2個星期前,我正在AppHarbor上運行我的網站,我認爲這是因爲我正在實施他們的「基本」(免費)計劃。如果我把我的工作線程從1到2,問題似乎就消失了。因此,我決定切換到Azure(無論如何我都會去,但不是這麼早)。自從切換到Azure後,問題並未消失。

我每天在網站上收到大約一打這些錯誤。看起來,當剃刀視圖試圖訪問它試圖讀取/顯示的對象的屬性時,總是出現錯誤,而不是在試圖檢索數據的控制器內拋出錯誤。也許它與延遲加載有關?但是,爲什麼會這麼重要,爲什麼在檢索數據後在極短的時間內丟失連接,然後在頁面上顯示呢?

我不知道如何調試這個問題,因爲它在我的開發環境中顯然不會發生。我將最終轉換到Dapper,但我至少在3個月內無法做到/開始這項工作。

這裏的任何想法?

編輯:這裏的網站http://www.wrestlestats.com

+0

是更糟重負載下?目前的操作超時是多少? –

+0

@HughJones與加載沒有任何關聯。可以向網站上的2個用戶拋出錯誤,或者50。我相信超時是30秒。 – ganders

+0

我對Hibernate沒有任何認識,但是你確定它不僅僅像一個需要大約30秒的查詢那樣簡單嗎?也許從錯誤消息中提取SELECT並對其進行試驗。如果它往往只是在你的超時的門檻上,即大約30秒,你可能有你的罪魁禍首。 –

回答

1

這些都是在雲環境中正常的瞬態錯誤。您需要實施重試邏輯/策略。

檢查這個答案:How do I add Retry Logic in NHibernate to handle Transient Failures in SQL Azure?

+0

謝謝,我會檢查一下。 – ganders

+0

我在這裏做了一些閱讀,這說如果您使用.NET 4.6.1,那麼您可以使用SqlClient.SqlConnection對象上的新連接嘗試選項。閱讀你發佈的鏈接,使用新的.NET功能代替鏈接中的功能聽起來不是很容易嗎? https://azure.microsoft.com/en-us/documentation/articles/sql-database-connectivity-issues/或者有什麼我在這裏失蹤的東西? – ganders

+0

我鏈接到的答案是相當古老,但提到NHibernate。你說得對,MS在最新的.NET Framework中添加了重試策略。 – CSharpRocks