Dot-Net

.net 4 和 EF 的 Sql 異常

  • July 19, 2019

我們使用 .net 4 MVC2 和 EF & Sql Server 2005。

對於某些請求,這種情況很少發生,只有當我們進行搜尋時,該搜尋是通過映射到執行全文搜尋的儲存過程的類來實現的,我們會得到異常:

[SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.]
  System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +2030802
  System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +5009584
  System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +234
  System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2275
  System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33
  System.Data.SqlClient.SqlDataReader.get_MetaData() +86
  System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +311
  System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +987
  System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162
  System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
  System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
  System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
  System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) +10
  System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +443

[EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details.]
  System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +479
  System.Data.Objects.ObjectContext.CreateFunctionObjectResult(EntityCommand entityCommand, EntitySet entitySet, EdmType edmType, MergeOption mergeOption) +182
  System.Data.Objects.ObjectContext.ExecuteFunction(String functionName, MergeOption mergeOption, ObjectParameter[] parameters) +218
  System.Data.Objects.ObjectContext.ExecuteFunction(String functionName, ObjectParameter[] parameters) +53

如果在錯誤發生後重試搜尋(使用相同或不同的術語),它會正常工作。

任何建議都非常感謝

謝謝

–MB

想法1:異常似乎發生在連接到sql server之後,並且在執行儲存過程時,我是否正確?如果是這種情況,那麼我需要延長查詢執行超時而不是連接超時?這可能嗎,在哪裡?

想法 2:也許我錯了,這可能是池中的陳舊連接?在 Java 世界中,您可以在應用程序獲取連接之前傳遞在連接上執行的 sql,以確保連接已打開並正常工作?會不會是這個原因。我無法在http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx中找到這樣的選項

想法3:我迷路了:)

您可以嘗試設置ObjectContext.CommandTimeout屬性:

獲取或設置所有對像上下文操作的超時值(以秒為單位)。空值表示將使用基礎提供程序的預設值。

是的,嘗試增加 web.config 中的連接超時:

<connectionStrings>
   <add name="AdventureWorksEntities" 
        connectionString="metadata=.\AdventureWorks.csdl|.\AdventureWorks.ssdl|.\AdventureWorks.msl;
        provider=System.Data.SqlClient;provider connection string='Data Source=localhost;
        Initial Catalog=AdventureWorks;Integrated Security=True;**Connection Timeout=60;**
        multipleactiveresultsets=true'" providerName="System.Data.EntityClient" />
</connectionStrings>

此外,您是否真的嘗試過手動執行 SPROC 需要多長時間?

引用自:https://stackoverflow.com/questions/4396833