2011-04-21 50 views
3

不時在我們的服務器拋出這個著名的例外:SQLEXCEPTION超時過期而沒有達到

超時過期。操作完成之前超時的時間或服務器沒有響應。

當服務器處理大請求時,會在壓力下發生。 我做了一些研究,發現我可以更改連接字符串連接超時設置和/或SqlCommand.Timeout數據讀取器屬性。

默認情況下,SQL命令超時設置爲秒和連接超時,我們從來沒有覆蓋它們。

我重現了上下文,並在管理工作室中手工執行了令人失望的請求。 他們的持續時間是大約在1秒,總是遠遠超過30

但奇怪的是,當我看看服務器日誌時,這個異常立即拋出請求調用。 我的意思是,請求正在執行,並在毫秒後引發異常。 對不起,但讓我做我的怪胎看看這個8-o

爲了完整起見,我們的sql實例與另一個鏡像鏡像在同步模式中。 我們通過表格適配器使用Ado.Net。

回答

3

事實上,即使在設置了READ_COMMITED_SNAPSHOT之後,我們仍然會遇到這些隨機超時。

以異步模式設置鏡像沒有幫助,在多個線程中完成的查詢在大約1ms後仍然隨機超時,總是處於繁忙時段。另一方面,觸發超時的特定查詢(INSERT語句)執行速度非常快(CPU時間小於1ms,平均讀取大約10次)。

調用堆棧是以下幾點:

在System.Data.ProviderBase.DbConnectionPool。的getConnection(的DbConnection owningObject)

在System.Data.ProviderBase.DbConnectionFactory.GetConnection(的DbConnection owningConnection)

在System.Data.ProviderBase.DbConnectionClosed.OpenConnection(的DbConnection outerConnection,DbConnectionFactory connectionFactory的)

在系統.Data.SqlClient.SqlConnection.Open()

因此,超時似乎與查詢本身沒有關係。

根據這個其他職位:Multiple Simultaneous SQL Connection Timeouts In Multithreaded Windows Service和鏈接MSDN blog post談到一個ADO.NET的錯誤,我們試圖連接超時設置爲連接的字符串中。

無法確定我們是否遇到此錯誤,但自此更改以來沒有更多超時。

0

我會在此時運行SQL Profiler並查看正在執行的查詢。

+0

我已經做到了,並重現了上下文,並在管理工作室中手動執行了令人失望的請求。事情是請求執行似乎沒有超過默認的超時時間,但無論如何發送了「超時異常」。 – Roubachof 2011-04-21 16:03:01

+0

查看MSDN上的這些信息 - 如果您還沒有這樣做。 http://msdn.microsoft.com/en-us/library/ms190181.aspx – 2011-04-21 21:03:26

+0

不幸的是我已經有... – Roubachof 2011-04-22 07:33:44

1

最後,跟蹤和分析的小時之後,這個問題是兩件事情的相關性:

  1. 讀取已提交SQL Server默認的隔離級別導致阻塞情況
  2. 一些實在太差了調整的要求和與無索引表混合存儲過程

第一個原因是固定

ALTER DATABASE <dbName> SET READ_COMMITTED_SNAPSHOT ON 

第二個清晰的請求重寫和表索引。

相關問題