为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

明月笑刀无情 2019-07-06 13:21:14
超时过期了。在操作完成或服务器没有响应之前经过的超时时间。声明已被终止我的网站上有很多用户(每天20000到60000),这是一个下载移动文件的网站。我可以远程访问我的服务器(Windowsserver2008-R2)。我收到了“服务器不可用”以前发生过错误,但现在正在看到连接超时错误。我对此不太熟悉-为什么会发生这种情况,如何解决呢?完整的错误如下:“/”应用程序中的服务器错误。超时过期了。在操作完成或服务器没有响应之前经过的超时时间。声明已经终止。描述:在执行当前Web请求时发生了未处理的异常。请查看堆栈跟踪以获得有关错误的更多信息,以及它起源于代码的位置。异常详细信息:System.Data.SqlClient.qlException:超时过期。在操作完成或服务器没有响应之前经过的超时时间。声明已经终止。源错误:在执行当前Web请求期间生成一个未处理的异常。有关异常的起源和位置的信息可以使用下面的异常堆栈跟踪来标识。堆栈跟踪:[SqlException(0x80131904):超时过期。在操作完成或服务器没有响应之前经过的超时时间。该陈述已被终止。System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔断续连接)+404System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()+412System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader Datastream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject state Obj)+1363System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader DS,RunBehaviorRunBehavior,StringresetOptionsString)+6387741System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehaviorRunBehavior,布尔返回流,布尔异步)+6389442System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehaviorrunBehavior,boboanback nStream,String方法,DbAsyncResult结果)+538System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult结果,字符串方法名,布尔sendTo管路)+689System.Data.SqlClient.SqlCommand.ExecuteNonQuery()+327NovinMedia.Data.DbObject.RunProcedure+209DataLayer.OnlineUsers.Update_SessionEnd_And_Online(Object Session_End,布尔联机)+440
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

我的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

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

  1. 使用

    Application["OnlineUsers"] = 0;

  2. 另一个使用数据库

因此,对于方法#2,我将所有OnlineUser重置为Application_Start..该表中有超过482 751项记录。


查看完整回答
反对 回复 2019-07-06
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

看起来您的查询所用的时间比应该的要长。从堆栈跟踪和代码中,您应该能够准确地确定是什么查询。

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

  1. 在某个地方有个僵局
  2. 数据库的统计信息和/或查询计划缓存不正确
  3. 查询太复杂,需要调优。

死锁可能很难修复,但很容易确定是否是这种情况。使用SQLServerManagementStudio连接到数据库。在左窗格中右击服务器节点并选择活动监视器..看看正在运行的进程。通常大多数都是空闲或运行的。当出现问题时,可以通过进程状态标识任何阻塞的进程。如果您右键单击该过程并选择细节它将显示进程执行的最后一个查询。

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

exec sp_updatestats

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

dbcc freeproccache

当您的服务器负载很重时,您不应该这样做,因为在第一次执行时,所有存储的过程和查询都会被重新编译,这将暂时导致严重的性能破坏。但是,由于您声明了问题的发生有时,并且堆栈跟踪指示您的应用程序正在启动,我认为您正在运行一个仅偶尔运行的查询。通过强制SQL Server不重用以前的查询计划,您可能会过得更好。看见这个答案有关如何做到这一点的详细信息。

我已经谈到了第三个问题,但是您可以很容易地通过手动执行查询来确定查询是否需要调优,例如使用SQLServerManagementStudio。如果查询要花很长时间才能完成,即使在重置统计数据之后,您也可能需要对其进行调优。关于这方面的帮助,您应该在一个新的问题中发布准确的查询


查看完整回答
反对 回复 2019-07-06
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

在运行存储过程的代码中,应该有如下内容:

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

增加这样一行代码:

c.CommandTimeout = 0;

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


查看完整回答
反对 回复 2019-07-06
  • 3 回答
  • 0 关注
  • 2125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信