超时过期。 操作完成之前超时的时间或服务器没有响应。 声明已经终止

我的网站上有很多用户(每天20000-60000),这是一个移动文件的下载网站。 我有远程访问我的服务器(Windows Server 2008 R2)。
我以前收到“服务器不可用”错误,但现在看到连接超时错误。
我不熟悉这个 – 为什么会发生,我该如何解决?

完整的错误如下:

“/”应用程序中的服务器错误。 超时过期。 操作完成之前超时的时间或服务器没有响应。 声明已经终止。 说明:执行当前Web请求期间发生未处理的异常。 请查看堆栈跟踪,了解有关错误的更多信息以及源代码的来源。

异常详细信息:System.Data.SqlClient.SqlException:超时过期。 操作完成之前超时的时间或服务器没有响应。 声明已经终止。

源错误:

执行当前Web请求期间生成未处理的异常。 有关异常的来源和位置的信息可以使用下面的异常堆栈跟踪来标识。

堆栈跟踪:

[SqlException(0x80131904):超时过期。 操作完成之前超时的时间或服务器没有响应。 声明已经终止。]
System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection)+404
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()+412
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)+1363
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,String resetOptionsString)+6387741
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔returnStream,布尔异步)+6389442
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔returnStream,String方法,DbAsyncResult结果)+538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result,String methodName,Boolean sendToPipe)+689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery()+327
NovinMedia.Data.DbObject.RunProcedure(String storedProcName,IDataParameter []参数,Int32&rowsAffected)+209
DataLayer.OnlineUsers.Update_SessionEnd_And_Online(对象Session_End,布尔在线)+440
NiceFileExplorer.Global.Application_Start(对象发件人,EventArgs e)+163

[HttpException(0x80004005):超时过期。 操作完成之前超时的时间或服务器没有响应。 声明已经终止。]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext上下文,HttpApplication应用程序)+405205​​3
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext,HttpContext上下文,MethodInfo []处理程序)+191
System.Web.HttpApplication.InitSpecial(HttpApplicationState state,MethodInfo []处理程序,IntPtr appContext,HttpContext上下文)+352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext,HttpContext上下文)+407
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)+375

[HttpException(0x80004005):超时过期。 操作完成之前超时的时间或服务器没有响应。 声明已经终止。]
System.Web.HttpRuntime.FirstRequestInit(HttpContext上下文)+11686928 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext上下文)+141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr,HttpContext上下文)+4863749


编辑答案后:
Global.asax Application_Start如下所示:

 protected void Application_Start(object sender, EventArgs e) { Application["OnlineUsers"] = 0; OnlineUsers.Update_SessionEnd_And_Online( DateTime.Now, false); AddTask("DoStuff", 10); } 

被调用的存储过程是:

 ALTER Procedure [dbo].[sp_OnlineUsers_Update_SessionEnd_And_Online] @Session_End datetime, @Online bit As Begin Update OnlineUsers SET [Session_End] = @Session_End, [Online] = @Online End 

我有两种获取在线用户的方法:

  1. 使用Application["OnlineUsers"] = 0;
  2. 另一个使用数据库

所以,对于方法#2我在Application_Start重置所有OnlineUser。 该表中有超过482,751条记录。

看起来你有一个比它应该更长的查询。 从你的堆栈跟踪和你的代码,你应该能够确切地确定是什么查询。

这种类型的超时可能有三个原因。

  1. 某处存在死锁
  2. 数据库的统计信息和/或查询计划缓存不正确
  3. 查询太复杂,需要调整

僵局可能难以解决,但很容易确定是否是这种情况。 使用Sql Server Management Studio连接到您的数据库。 在左侧窗格中,右键单击服务器节点,然后选择“ 活动监视器” 。 看看正在运行的进程。 通常情况下,大多数会空闲或运行。 发生问题时,可以通过进程状态识别任何被阻塞的进程。 如果右键单击进程并选择详细信息,它将显示进程执行的最后一个查询。

第二个问题将导致数据库使用次优查询计划。 可以通过清除统计来解决:

 exec sp_updatestats 

如果这不起作用,你也可以尝试

 dbcc freeproccache 

当你的服务器负载很重时,你不应该这样做,因为当第一次执行时,所有存储的过程和查询都会被重新编译,因此会暂时产生大的性能。 但是,由于您有时会指出问题,并且堆栈跟踪显示您的应用程序正在启动,所以我认为您正在运行一个仅偶尔运行的查询。 通过强制SQL Server不要重复使用先前的查询计划,可能会更好。 看到这个答案有关如何做到这一点的细节。

我已经谈到了第三个问题,但是您可以通过手动执行查询来轻松确定查询是否需要调优,例如使用Sql Server Management Studio。 如果查询需要很长时间才能完成,即使在重置统计信息之后,您也可能需要对其进行调整。 为了获得帮助,你应该在一个新的问题中发布确切的查询。

在你运行存储过程的代码中,你应该有这样的东西:

 SqlCommand c = new SqlCommand(...) //... 

添加这样一行代码:

 c.CommandTimeout = 0; 

这将等待操作完成所需的时间。

您可以设置SQL命令的CommandTimeout属性以允许长时间运行的SQL事务。

您可能还需要查看导致超时的SQL查询。

虽然之前的所有答复都涉及这个问题,但并没有涵盖所有的情况。

微软已经确认了这个问题,并在2011年修复了它的支持的操作系统,所以如果你得到如下的堆栈跟踪:

 Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) 

您可能需要更新您的.NET程序集。

出现此问题的原因是镜像数据库的连接重试算法中存在错误。

当使用重试算法时,数据提供程序等待第一次读取(SniReadSync)调用完成。 该调用被发送到运行SQL Server的后端计算机,等待时间是通过将连接超时值乘以0.08来计算的。 但是,如果响应速度较慢,并且在等待时间过期之前第一个SniReadSync调用未完成,则数据提供程序会错误地将连接设置为注视状态。

详情请参阅知识库文章2605597

https://support.microsoft.com/kb/2605597

也许这对别人有用。 我面临着同样的问题,在我的情况下,原因是SqlConnection被打开,并没有被放置在我调用循环大约2500次迭代的方法。 连接池已耗尽。 妥善处置解决了这个问题。

我最近遇到这个错误,经过一番简短的调查,发现原因是我们的磁盘空间不足,拿着数据库(小于1GB)。

只要我将数据库文件(.mdf和.ldf)移出到同一台服务器上的另一个磁盘(具有更多的空间),就会在三秒内加载超时的同一页(运行查询)。

另一个要调查的问题是在尝试解决此错误时,数据库日志文件的大小。 您的日志文件可能需要缩小。

我在3天左右面临同样的问题。 我注意到,由于我们的记录数量并不多,我们的高级开发人员在数据库中保存了2张图像和指纹。 当我试图获取这个十六进制值需要很长时间,我计算平均时间来执行我的程序大约38秒。 默认的commandtimeout是30秒,因此运行我的存储过程所需的时间少于平均时间。 我像下面设置我的commandtimeout

 cmd.CommandTimeout = 50 

和它的工作正常,但有时如果您的查询需要超过50秒将提示相同的错误。

@SilverLight ..这显然是一个数据库对象的问题。 它可能是一个写得不好的查询,或缺少索引。 但截至目前,我不会建议你增加超时没有调查与您的数据库对象的问题

 NovinMedia.Data.DbObject.RunProcedure(String storedProcName, IDataParameter[] parameters, Int32& rowsAffected) +209 

在这行代码上放置一个断点以查找过程名称,然后通过查看其执行计划来优化过程。

直到您发布有关存储过程的详细信息时,我都无法帮到您。

尝试

 EXEC SP_CONFIGURE 'remote query timeout', 1800 reconfigure EXEC sp_configure EXEC SP_CONFIGURE 'show advanced options', 1 reconfigure EXEC sp_configure EXEC SP_CONFIGURE 'remote query timeout', 1800 reconfigure EXEC sp_configure 

然后重建你的索引

你必须设置CommandTimeout属性。 您可以在DbContext子类中设置CommandTimeout属性。

 public partial class StudentDatabaseEntities : DbContext { public StudentDatabaseEntities() : base("name=StudentDatabaseEntities") { this.Database.CommandTimeout = 180; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { throw new UnintentionalCodeFirstException(); } public virtual DbSet<StudentDbTable> StudentDbTables { get; set; } } 

我在sp_foo有大量计算的问题,所以我需要很长的时间,所以我修好了
用这个小小的代码

 public partial class FooEntities : DbContext { public FooEntities() : base("name=FooEntities") { this.Configuration.LazyLoadingEnabled = false; // Get the ObjectContext related to this DbContext var objectContext = (this as IObjectContextAdapter).ObjectContext; // Sets the command timeout for all the commands objectContext.CommandTimeout = 380; }