Sql异常.net 4& EF

时间:2010-12-09 09:51:14

标签: .net entity-framework-4

我们正在使用.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:我迷路了:)。

4 个答案:

答案 0 :(得分:14)

您可以尝试设置ObjectContext.CommandTimeout属性:

  

获取或设置所有对象上下文操作的超时值(以秒为单位)。空值表示将使用基础提供程序的默认值。

答案 1 :(得分: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需要多长时间才能执行?

答案 2 :(得分:1)

我使用的是EF 4.3.1,SQL 2008,并且EF linq查询的问题与默认的30秒相同。

所以我设置了“连接超时= 120;”在连接字符串中。

然后重写DbContext构造函数并设置所有Command超时以使用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();

答案 3 :(得分:0)

杰夫·绪方(Jeff Ogata)的回答是正确的,但它不能解决我刚刚遇到的超时问题,因此我想我会详细说明,以防其他任何人遇到这个问题。 如果创建命令来执行存储过程,则新命令的默认超时为30秒,而不管上下文上设置的超时如何。您将需要单独调整此超时。这是一个示例:

_context.Database.CommandTimeout = 600; // This will not be used by cmd!
using (var cmd = _context.CreateCommandForStoredProc("StoredProcsName"))
{
    cmd.CommandTimeout = 600;
    await cmd.ExecuteScalarAsync();
}