2010-12-09 68 views
8

,我們使用的是.NET 4 MVC2與EF & SQL Server 2005的SQL異常使用.NET 4 EF

對於一些要求,而且這種情況很少出現,只有當我們正在做這與類實現搜索映射到進行全文搜索存儲過程,我們得到 異常:

[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找到這樣一個選項:我迷路了:)

回答

14

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

獲取或設置超時值,以秒爲單位的所有對象上下文操作。空值表示將使用基礎提供程序的默認值。

1

是,嘗試增加連接超時,這是在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需要多長時間才能執行?

+4

至於連接超時屬性,正如我所說我不認爲這是問題。 MSN表示:「終止嘗試併產生錯誤之前,等待連接到服務器的時間長度(以秒爲單位)。」但是,在等待連接到服務器時,異常似乎正在發生,而在等待查詢的執行時。 Arent這兩樣東西不同? 我不認爲這個問題是SPROC執行時間,因爲在例外之後,當我重試對另一個術語進行搜索時,它一切正常。 無論如何非常感謝你的答案,我會嘗試一下。 – 2010-12-09 10:27:28

1

我使用的是EF 4.3.1,SQL 2008,並且EF查詢所花費的時間比默認的30秒還要長。

因此,我設置「連接超時= 120;」在連接字符串中。

然後覆蓋DbContext構造函數,並將所有命令超時設置爲使用Connection String中的Connection Timeout;

public class FooContext : DbContext 
{ 
    public FooContext() 
    { 
     // Set all commands to use the connection timeout from the connection string 
     SetCommandTimeout(this.Database.Connection.ConnectionTimeout); 
    } 

    public void SetCommandTimeout(int timeout) 
    { 
     // Get the ObjectContext related to this DbContext 
     var objectContext = (this as IObjectContextAdapter).ObjectContext; 
     objectContext.CommandTimeout = this.Database.Connection.ConnectionTimeout;    
    } 
} 

如果你只是想增加超時某些查詢,然後取出構造並設置爲按要求;

var db = new FooContext(); 
db.SetCommandTimeout(120); 
db.Bars.ToList();