更新條目時出錯。有關詳細資訊,請參閱內部異常。一世ññ和R一世ññ和RINNER執行超時已過期
我們的生產 SQL Server 之一的數據庫性能不佳。在應用程序方面,他們遇到了這個錯誤:
更新條目時出錯。有關詳細資訊,請參閱內部異常。
$$ INNER $$執行超時已過期。操作完成前超時時間已過或伺服器未響應。
$$ INNER $$等待操作超時;
這些是我們嘗試解決的以下問題:
- 檢查是否有任何鎖定和阻塞正在進行 - 沒有發生重大阻塞。如果發生阻塞,則資源會被阻塞不到 1 分鐘並針對不同的數據庫。
- 使用分析器擷取的查詢。我們注意到插入、更新和選擇是同時發生的。所以我們假設某處可能發生了內部鎖定,但不知道在哪裡。
- 不存在碎片。
- SQL Server 錯誤日誌中沒有產生任何錯誤。
- 擷取了一周的性能計數器,但沒有顯示任何關鍵資訊。
以前有沒有人遇到過這些錯誤?如果是這樣,您採取了哪些措施來排除故障並解決錯誤?
預設情況下,.Net 客戶端有30 秒的客戶端命令超時。您看到的錯誤是伺服器的響應時間超過 30 秒。
下面是一些範例 C# 程式碼,通過執行等待 31 秒的WAITFOR DELAY語句來顯示問題:
using System; using System.Data.SqlClient; namespace ConnectionTimeoutTest { class Program { static void Main(string[] args) { SqlConnectionStringBuilder sqlConnectionStringBuilder = new System.Data.SqlClient.SqlConnectionStringBuilder { InitialCatalog = "tempdb", IntegratedSecurity = true, DataSource = "localhost" }; using SqlConnection connection = new SqlConnection(); connection.ConnectionString = sqlConnectionStringBuilder.ConnectionString; connection.Open(); using SqlCommand sqlCommand = new SqlCommand("WAITFOR DELAY '00:00:31';SELECT 'Hello World!';", connection); SqlDataReader reader = sqlCommand.ExecuteReader(); while (reader.Read()) { Console.WriteLine(reader.GetString(0)); }; } } }
還有一個例外:
System.Data.SqlClient.SqlException
HResult=0x80131904
**消息=超時已過期。在操作完成之前超時時間已過或伺服器沒有響應。
Source=Core .Net SqlClient 數據提供程序**
StackTrace:
在 System.Data.SqlClient.SqlConnection.OnError(SqlException 異常,布爾 breakConnection,Action wrapCloseInAction)
在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 異常,布爾 breakConnection,Action wrapCloseInAction)
在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布爾呼叫者HasConnectionLock,布爾非同步關閉)
在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&dataReady)
在 System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
在 System.Data.SqlClient.SqlDataReader。 get_MetaData()
在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,String resetOptionsString)
在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,布爾返回流,布爾非同步,Int32 超時,任務&任務,布爾 asyncWrite,SqlDataReader ds)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,TaskCompletionSource`1 完成,Int32 超時,Task& 任務,布爾 asyncWrite,String 方法)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior , RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SqlClient.SqlCommand.ExecuteReader()
at ConnectionTimeoutTest.Program.Main(String
$$ $$args) 在 C:\Users\Hannah.MVCT\source\repos\ConnectionTimeoutTest\ConnectionTimeoutTest\Program.cs:line 23 內部異常 1:
Win32Exception:等待操作超時。
這是使客戶端等待 60 秒的修復程序:
using System; using System.Data.SqlClient; namespace ConnectionTimeoutTest { class Program { static void Main(string[] args) { SqlConnectionStringBuilder sqlConnectionStringBuilder = new System.Data.SqlClient.SqlConnectionStringBuilder { InitialCatalog = "tempdb", IntegratedSecurity = true, DataSource = "localhost" }; using SqlConnection connection = new SqlConnection(); connection.ConnectionString = sqlConnectionStringBuilder.ConnectionString; connection.Open(); using SqlCommand sqlCommand = new SqlCommand("WAITFOR DELAY '00:00:31';SELECT 'Hello World!';", connection); sqlCommand.CommandTimeout = 60; // <---- this is new SqlDataReader reader = sqlCommand.ExecuteReader(); while (reader.Read()) { Console.WriteLine(reader.GetString(0)); }; } } }
上面的程式碼在GitHub中可用。
您可以採取的第一步來解決您的錯誤:
- 嘗試
Connection Timeout
將連接字元串中的屬性從預設的 15(或 30)增加到 60 或更多秒- 嘗試增加對象
CommandTimeout
的屬性SqlCommand
(漢娜的答案非常詳細地說明瞭如何做到這一點)。直到最近,
.NET System.Data.SqlClient
驅動程序才允許通過對象設置CommandTimeout
唯一的。SqlCommand
請注意,在較新的Microsoft.Data.SqlClient
驅動程序中,特別是 v2.1,您現在可以通過連接字元串設置它,它將自動應用於與該連接關聯的任何 SqlCommand如果 #1 減少或消除了錯誤,那麼您遇到了連接錯誤
如果 #2 有幫助(比 #1 更有可能),那麼您遇到了長時間執行的查詢問題(超過 30 秒),您必須更深入地探勘了解導致查詢緩慢的原因