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