猿问

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

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

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

完整的错误如下:

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

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

源错误:

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

堆栈跟踪:

[SqlException(0x80131904):超时过期。在操作完成或服务器没有响应之前经过的超时时间。该陈述已被终止。
System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔断续连接)+404
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()+412
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader Datastream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject state Obj)+1363
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader DS,RunBehaviorRunBehavior,StringresetOptionsString)+6387741
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehaviorRunBehavior,布尔返回流,布尔异步)+6389442
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehaviorrunBehavior,boboanback nStream,String方法,DbAsyncResult结果)+538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult结果,字符串方法名,布尔sendTo管路)+689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery()+327
NovinMedia.Data.DbObject.RunProcedure+209
DataLayer.OnlineUsers.Update_SessionEnd_And_Online(Object Session_End,布尔联机)+440

明月笑刀无情
浏览 2126回答 3
3回答

largeQ

我的Application_Start在……里面Global.asax如下所示: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 bitAsBegin     Update OnlineUsers     SET        [Session_End] = @Session_End,         [Online] = @OnlineEnd我有两种获得在线用户的方法:使用Application["OnlineUsers"] = 0;另一个使用数据库因此,对于方法#2,我将所有OnlineUser重置为Application_Start..该表中有超过482 751项记录。

天涯尽头无女友

看起来您的查询所用的时间比应该的要长。从堆栈跟踪和代码中,您应该能够准确地确定是什么查询。这种类型的超时可能有三个原因;在某个地方有个僵局数据库的统计信息和/或查询计划缓存不正确查询太复杂,需要调优。死锁可能很难修复,但很容易确定是否是这种情况。使用SQLServerManagementStudio连接到数据库。在左窗格中右击服务器节点并选择活动监视器..看看正在运行的进程。通常大多数都是空闲或运行的。当出现问题时,可以通过进程状态标识任何阻塞的进程。如果您右键单击该过程并选择细节它将显示进程执行的最后一个查询。第二个问题将导致数据库使用次优查询计划。可以通过清除统计数据来解决这一问题:exec sp_updatestats如果不起作用,你也可以试试dbcc freeproccache当您的服务器负载很重时,您不应该这样做,因为在第一次执行时,所有存储的过程和查询都会被重新编译,这将暂时导致严重的性能破坏。但是,由于您声明了问题的发生有时,并且堆栈跟踪指示您的应用程序正在启动,我认为您正在运行一个仅偶尔运行的查询。通过强制SQL Server不重用以前的查询计划,您可能会过得更好。看见这个答案有关如何做到这一点的详细信息。我已经谈到了第三个问题,但是您可以很容易地通过手动执行查询来确定查询是否需要调优,例如使用SQLServerManagementStudio。如果查询要花很长时间才能完成,即使在重置统计数据之后,您也可能需要对其进行调优。关于这方面的帮助,您应该在一个新的问题中发布准确的查询

回首忆惘然

在运行存储过程的代码中,应该有如下内容:SqlCommand c = new SqlCommand(...)//...增加这样一行代码:c.CommandTimeout = 0;这将等待操作完成所需的时间。
随时随地看视频慕课网APP
我要回答