我有一個C# dotnet core 3.1 Asp.net MVC應用程式,運行在Ubuntu 18.04。它使用Entity Framework連接到一個運行在Windows Server 2016上的遠程Sql Server。大多數時候,連接和查詢作業正常。然而,偶爾,特別是當連接應用程式沒有收到任何查詢資料庫的請求時,我得到了這個超時錯誤:
fail: Microsoft.EntityFrameworkCore.Query[10100]
在對背景關系型別'OptionsAPI.Services.OptionsDbContext'的查詢結果進行迭代時,資料庫中出現了例外。
System.Data.SqlClient.SqlException(0x80131904)。超時已過。 在操作完成之前,超時時間已經過了,或者服務器沒有回應。
---> System.ComponentModel.Win32Exception(258)。未知錯誤258。
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
在System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite, String method)
at 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.ExecuteDbDataReader(CommandBehavior behavior)
在System.Data.Common.DbCommand.ExecuteReader()
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
在Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()
ClientConnectionId:a5e255ac-8539-4e14-96f-71a7d565cc88
錯誤編號:-2,狀態:0,類別:11。
System.Data.SqlClient.SqlException(0x80131904)。超時已過。 在完成操作之前,超時時間已經過了,或者服務器沒有回應。
---> System.ComponentModel.Win32Exception(258)。未知錯誤258。
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
在System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite, String method)
at 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.ExecuteDbDataReader(CommandBehavior behavior)
在System.Data.Common.DbCommand.ExecuteReader()
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
在Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()
ClientConnectionId:a5e255ac-8539-4e14-96f-71a7d565cc88
錯誤號碼:-2,狀態:0,類別:11。
我不確定為什么會發生這種情況。我意識到這有點模糊,但我在網上搜索了類似的問題,我不知道接下來該怎么做,只能問一個模糊的問題。
uj5u.com熱心網友回復:
你是否注意到錯誤資訊是如何說的 "超時或斷開連接"?你可能給遠程的mssql分配了一個長期運行的操作,而你的客戶端被設定為不等待那么長時間。有一種方法可以在客戶端的連接上設定更長或不確定的超時。你可以通過連接字串,或者通過SqlConnection/SqlCommand實體上的Timeout屬性來做到這一點。如果超時確實是問題所在,你應該考慮如何優化資料庫的作業,因為保持連接開放 10 分鐘以上(我想,10 分鐘是默認值)聽起來并不好。
還要調查你是否以某種方式參考了與你的 sqlclient 有關的 .Net Framework 包(而不是 dotnetcore)--我覺得很奇怪,在該錯誤的堆疊跟蹤中提到了 Win32,這似乎都是與發生在客戶端的行程有關。也許有些東西并不完全兼容。看看是否有EF核心包的更新。我知道上次我用它作業的時候,它們有一些錯誤,所以我不會感到驚訝。
或者,檢查你對OptionsDbContext實體的使用情況,并確保你在資料庫作業完成后關閉/處置/銷毀它。EF的DbContext被設計成只用于一個作業單元,它不應該被保留在其他執行緒或未來行程/請求中使用。如果你在使用DI,請確保該實體和其他使用該實體的人沒有被注冊為單子。你的錯誤表明,這可能是一個被遺忘(未關閉)的連接的結果,該連接最終會被丟棄(默認情況下,由客戶端在 10 分鐘后丟棄),作為一個副作用引發該例外。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/320371.html
標籤:
