超时过期.操作完成前的超时时间或服务器没有响应.语句已被终止



我的网站有很多用户(每天20000-60000),这是一个手机文件下载网站。我可以远程访问我的服务器(windows server 2008-R2)。
我以前收到过&"服务器不可用&"错误,但我现在看到的是连接超时错误。
我不熟悉这个-为什么会发生,我怎么能解决它?

完整错误如下:

'/'应用程序中的服务器错误。超时过期。超时时间在操作完成之前经过的时间,或者服务器没有响应。语句已被终止。描述:一个执行当前web时发生未处理的异常请求。有关的详细信息,请查看堆栈跟踪错误和它在代码中的起源。

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

源错误:

的过程中产生了一个未处理的异常当前的web请求。关于来源和地点的信息可以使用下面的异常堆栈跟踪来识别异常。

堆栈跟踪:

[SqlException (0x80131904): Timeout expired.]超时时间在操作完成之前经过的时间,或者服务器没有响应。语句已被终止。]
System.Data.SqlClient.SqlConnection。OnError (SqlException异常,breakConnection) +404
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +412
System.Data.SqlClient.TdsParser。运行(RunBehavior RunBehavior,SqlCommand cmdHandler, SqlDataReader dataStreamBulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObjectstatobj) +1363
System.Data.SqlClient.SqlCommand。FinishExecuteReader (SqlDataReader ds,RunBehavior RunBehavior, String resetOptionsString) +6387741
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehaviorRunBehavior, RunBehavior,布尔值Async) +6389442
System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehaviorRunBehavior, RunBehavior,布尔返回流,字符串method, DbAsyncResult result) +538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (DbAsyncResultresult, String methodName, Boolean sendToPipe) +689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +327
NovinMedia.Data.DbObject。storedProcName RunProcedure(字符串,IDataParameter[]参数,Int32&rowsAffected
DataLayer.OnlineUsers。Session_End Update_SessionEnd_And_Online(对象,布尔值在线)+440
NiceFileExplorer.Global。Application_Start(对象发送者,EventArgs e)+ 163

[HttpException (0x80004005): Timeout expired.]超时时间在操作完成之前经过的时间,或者服务器没有响应。语句已被终止。]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (HttpContextcontext, httpapplicationapp) +4052053
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS (IntPtrappContext, HttpContext context, MethodInfo[] handlers) +191
System.Web.HttpApplication。InitSpecial (HttpApplicationState状态,MethodInfo[] handlers, IntPtr appContext, HttpContext) +352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (IntPtrappContext, HttpContext) +407
System.Web.Hosting.PipelineRuntime.InitializeApplication (IntPtrappContext) + 375

[HttpException (0x80004005): Timeout expired.]超时时间在操作完成之前经过的时间,或者服务器没有响应。语句已被终止。]
System.Web.HttpRuntime。第一个strequestinit (HttpContext context) +11686928System.Web.HttpRuntime。EnsureFirstRequestInit (HttpContext上下文)+ 141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate (IIS7WorkerRequestwr, HttpContext context) +4863749


EDIT AFTER ANSWERS:
我的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,我将所有OnlineUsers重置为Application_Start。这个表中有超过482751条记录

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

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

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

死锁可能很难修复,但很容易确定是否存在死锁。使用Sql Server Management Studio连接到数据库。在左窗格中,右键单击服务器节点并选择Activity Monitor。看看正在运行的进程。通常情况下,大多数将处于空闲状态或运行状态。当问题发生时,您可以通过进程状态识别任何阻塞的进程。如果您右键单击进程并选择details,它将显示该进程执行的最后一个查询。

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

exec sp_updatestats

如果不行,你也可以试试

dbcc freeproccache

当您的服务器处于高负载时不应该这样做,因为当所有存储进程和查询在第一次执行时被重新编译时,它会暂时导致很大的性能损失。但是,由于您声明问题有时发生,并且堆栈跟踪表明您的应用程序正在启动,因此我认为您正在运行一个仅偶尔运行的查询。强制SQL Server不重用以前的查询计划可能会更好。有关如何做到这一点的详细信息,请参阅此回答。

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

在您运行存储过程的代码中,您应该有这样的内容:

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

添加这样一行代码:

c.CommandTimeout = 0;

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

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

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

我也有同样的问题,并通过添加"连接时间"来解决。web中的价值。配置文件。找到connectionStrings并添加Connection Timeout=3600"

这里是示例

  <connectionStrings>
    <add name="MyConn" providerName="System.Data.SqlClient" connectionString="Data Source=MySQLServer;Initial Catalog=MyDB;User ID=sa;Password=123;Connection Timeout=3600" />
  </connectionStrings>

也许它会对某人有用。我面临着同样的问题,在我的情况下,原因是SqlConnection被打开,而不是在我在循环中调用了大约2500次迭代的方法中被处理。连接池耗尽。妥善的处理解决了问题。

虽然所有早期的回复都解决了这个问题,但它们并没有涵盖所有情况。

微软已经承认了这个问题,并在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调用不是在等待时间到期前完成。

详情见KB 2605597

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

必须设置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; }
}

我遇到了同样的问题,工作了大约3天。我注意到,由于我们的记录数量不多,我们的高级开发人员在数据库中保留了2个图像和指纹。当我试图获取这个十六进制值,它需要很长时间,我计算平均时间来执行我的过程约38秒。默认的命令超时是30秒,所以它比运行存储过程所需的平均时间要短。我将我的命令超时设置如下

cmd.CommandTimeout = 50

,它工作得很好,但有时如果你的查询超过50秒,它会提示同样的错误。

. NET Core使用Startup.cs约定,您可以像这样访问和设置查询命令超时选项:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContextPool<MyDbContext>(_ =>
    {
        _.UseSqlServer(Configuration.GetConnectionString("MyConnectionString"), options => 
        {
            options.CommandTimeout(180); // 3 minutes
        });
    });
}

我最近遇到了这个错误,经过一些简短的调查,发现原因是我们在保存数据库的磁盘上耗尽了空间(小于1GB)。

一旦我移出数据库文件()。MDF和.ldf)到同一服务器上的另一个磁盘(有更多的空间),在三秒内加载了超时的同一页面(运行查询)。

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

默认超时时间为15秒,0为无限制,其他任意数值为秒数。

In Code

using (SqlCommand sqlCmd = new SqlCommand(sqlQueryString, sqlConnection))
   {
      sqlCmd.CommandTimeout = 0; // 0 = give it as much time as it needs to complete
      ...
    }

In Your Web。配置"Command Timeout=0;"不超时,或低于1小时(3600秒)

  <add name="ConnectionString" connectionString="Data Source=ServerName;User ID=UserName;Password=Password;Command Timeout=3600;" providerName="System.Data.SqlClient" />

我在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;
    }

@SilverLight..这显然是数据库对象的问题。它可能是一个写得很糟糕的查询,或者缺少索引。但是到目前为止,我不建议您在没有调查数据库对象

问题的情况下增加超时。
NovinMedia.Data.DbObject.RunProcedure(String storedProcName, IDataParameter[] parameters, Int32& rowsAffected) +209

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

在您发布存储过程的详细信息之前,我无法为您提供更多帮助。

在我的情况下,我使用EntityFrameworkCore
因为我想处理的输入超出了查询限制,所以出现了这个错误。
对于我的情况,解决方案是将数据处理拆分为,通过这种方法,我能够适应限制。
是的,这需要时间,但至少它处理了所有的输入记录。

try

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

然后重建索引

TLDR :

    在数据量、网络设置和代码没有改变的情况下,重启应用程序和数据库服务器是最快的修复方法。我们总是这样做作为一个规则
  1. 可能是硬盘故障需要更换的指示-检查系统通知

我经常因为各种原因遇到这个错误,并有各种解决方案,包括:

  1. 重构我的代码以使用SqlBulkCopy
  2. 增加超时值,如在各种答案或检查中所述根本原因(可能与数据无关)
  3. 连接超时(默认为15秒)-在终止之前等待与SQL服务器建立连接所需的时间- TCP/PORT相关-可以通过故障排除检查表(非常方便的MSDN文章)
  4. 命令超时(默认30s) -等待查询执行所需的时间-查询执行/网络流量相关-也有故障排除过程(另一篇非常方便的MSDN文章)
  5. 重新启动服务器-应用程序&数据库服务器(如果单独)——代码和数据没有改变,环境必须改变——你必须做的第一件事。通常由补丁(操作系统、。net Framework或SQL Server补丁或更新)引起。特别是如果超时异常出现如下(即使我们不使用Azure):
    • System.Data.Entity.Core。EntityException:引发了一个异常,很可能是由于临时故障引起的。如果要连接到SQL Azure数据库,请考虑使用SqlAzureExecutionStrategy。--> System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时发生错误。有关详细信息,请参阅内部异常。System.Data.SqlClient.SqlException:从服务器接收结果时发生传输级错误。(provider: TCP provider, error: 0 -信号量超时时间已经过期。)---> System.ComponentModel. net。Win32Exception:信号量超时时间已过期

还要确保没有挂起的事务。:)

我正在做一些测试,并开始了一个交易,以确保安全,但从未关闭它。我希望错误会更明确,但是哦,好吧!

我们在Timeout expired/max pool reached Sqlexception上遇到了困难。为了防止重启服务器或服务,我们修改了SQL server中的MAX SERVER MEMORY变量(通过SQL management Studio或T-SQL):

DECLARE @maxMem INT = 3000 --Max. memory for SQL Server instance in MB
EXEC sp_configure 'show advanced options', 1
RECONFIGURE

这暂时修复了这个问题,直到它再次发生。在我们的例子中,我们怀疑它与应用级的连接泄漏有关。

我们最近升级到SqlClient (Microsoft.Data.SqlClient)的NuGet版本,其中包含一个错误。这个bug是在1。X周期,已经被修复。该修复将在2.0.0版本中提供,但在撰写本文时尚未提供。

你可以在这里查看细节:https://github.com/dotnet/SqlClient/issues/262

我有这个问题,当我从ADO移动时它就消失了。Net向Dapper询问我的问题。

我曾经遇到过这个问题,在我的情况下是SQL中未提交的事务。在我承诺之后,问题就消失了。

超时,因为sql查询花费的时间比设置的要长在sqlCommand。CommandTimeout财产。

显然你可以增加CommandTimeout来解决这个问题,但是在此之前,您必须通过添加索引来优化查询。如果你运行您的查询Sql server管理工作室,包括实际执行计划,则Sql server管理工作室将建议你的固有索引。大多数情况下,您将摆脱超时问题如果你能优化你的查询。

您还需要检查单个记录是否没有在逻辑中更新,因为在该地方使用更新触发器也会导致超时错误。

因此,解决方案是确保在循环/游标之后执行批量更新,而不是在循环中每次执行一条记录。

正如其他人所说,问题可能与挂起的事务有关。在我的例子中,我必须将DbTransaction变量作为ExecuteScalar方法的参数发送,以便正确执行过程。

:

ExecuteScalar(command)
:后

ExecuteScalar(command, transaction)

我在多线程程序上得到了相同的错误,同时连接了超过2000个用户。当我运行一个超过5000行的SELECT命令时,问题发生了。该命令被插入命令阻塞。通过将SELECT *更改为SELECT Top(n) *, n<5000,它修复了

您可能忘记了awaitasync语句?你会得到一个类似的消息,如果你的task最终需要更长的时间,然后当你的线程被中止。

最新更新