it-swarm-ko.tech

제한 시간이 만료되었습니다. 작업이 완료되기 전에 시간 초과 기간이 경과했거나 서버가 응답하지 않습니다. 그 진술서는 만료되었습니다

모바일 파일 다운로드 사이트 인 내 웹 사이트 (하루에 20000-60000)에 많은 사용자가 있습니다. 내 서버 (Windows server 2008-R2)에 대한 원격 액세스 권한이 있습니다.
나는 "서버를 사용할 수 없습니다."errors 전에받은 적이 있지만 연결 시간 초과 오류가 표시됩니다.
나는 이것에 익숙하지 않다. 왜 그런 일이 일어나고 어떻게 해결할 수 있는가?

전체 오류는 다음과 같습니다.

'/'응용 프로그램의 서버 오류입니다. 제한 시간이 만료되었습니다. 작업이 완료되기 전에 시간 초과 기간이 경과되었거나 서버가 응답하지 않습니다. 그 진술서는 만료되었습니다. 설명 : 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 오류 및 코드에서 시작된 위치에 대한 자세한 정보는 스택 추적을 검토하십시오.

예외 정보 : System.Data.SqlClient.SqlException : 시간 종료가 만료되었습니다. 작업이 완료되기 전에 시간 초과 기간이 경과되었거나 서버가 응답하지 않습니다. 그 진술서는 만료되었습니다.

원본 오류 :

처리되지 않은 예외가 현재 웹 요청을 실행하는 동안 생성되었습니다. 예외의 원점과 위치에 관한 정보는 아래의 예외 스택 추적을 사용하여 식별 할 수 있습니다.

스택 추적 :

[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 결과, String methodName, 부울 sendToPipe) +689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery () +327
NovinMedia.Data.DbObject.RunProcedure (문자열 storedProcName, IDataParameter [] 매개 변수, Int32 및 rowsAffected) +209
DataLayer.OnlineUsers.Update_SessionEnd_And_Online (개체 Session_End, 부울 온라인) +440
NiceFileExplorer.Global.Application_Start (Object sender, EventArgs e) +163

[HttpException (0x80004005) : 제한 시간이 만료되었습니다. 작업이 완료되기 전에 시간 초과 기간이 경과되었거나 서버가 응답하지 않습니다. 그 진술서는 만료되었습니다.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (HttpContext 컨텍스트, HttpApplication 응용 프로그램) +4052053
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS (IntPtr appContext, HttpContext 컨텍스트, MethodInfo [] 핸들러) +191
System.Web.HttpApplication.InitSpecial (HttpApplicationState 상태, 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


응답 후 편집 :
Application_StartGlobal.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 bit
As
Begin
    Update OnlineUsers
    SET
        [Session_End] = @Session_End,
        [Online] = @Online

End

온라인 사용자를 얻는 방법에는 두 가지가 있습니다.

  1. Application["OnlineUsers"] = 0; 사용
  2. 다른 하나는 데이터베이스를 사용한다.

그래서, 방법 # 2를 위해 나는 모든 OnlineUsers를 Application_Start에 리셋했다. 해당 테이블에는 482,751 개가 넘는 레코드가 있습니다.

258
SilverLight

쿼리가 오래 걸리는 것처럼 보입니다. 스택 추적과 코드에서 정확히 어떤 쿼리인지 판단 할 수 있어야합니다.

이 유형의 제한 시간에는 세 가지 원인이있을 수 있습니다.

  1. 어딘가에 교착 상태가 있습니다.
  2. 데이터베이스 통계 및/또는 쿼리 계획 캐시가 올바르지 않습니다.
  3. 쿼리가 너무 복잡하여 조정해야합니다.

교착 상태는 해결하기가 어려울 수 있지만 그 여부를 쉽게 판단 할 수 있습니다. Sql Server Management Studio를 사용하여 데이터베이스에 연결하십시오. 왼쪽 창에서 서버 노드를 마우스 오른쪽 단추로 클릭하고 Activity Monitor 를 선택하십시오. 실행중인 프로세스를 살펴보십시오. 일반적으로 대부분 유휴 상태이거나 실행 중입니다. 문제가 발생하면 프로세스 상태로 차단 된 프로세스를 식별 할 수 있습니다. 프로세스를 마우스 오른쪽 단추로 클릭하고 details 를 선택하면 프로세스가 실행 한 마지막 쿼리가 표시됩니다.

두 번째 문제는 데이터베이스가 최적이 아닌 쿼리 계획을 사용하도록합니다. 통계를 지우면 해결할 수 있습니다.

exec sp_updatestats

작동하지 않는 경우 시도해 볼 수도 있습니다.

dbcc freeproccache

처음 실행될 때 저장된 procs와 쿼리가 다시 컴파일 될 때 일시적으로 큰 성능 저하가 발생하기 때문에 서버가 과부하 일 때이 작업을 수행해서는 안됩니다. 그러나 문제는 때때로 가 발생하고 스택 추적에서 응용 프로그램이 시작되고 있음을 나타내므로 가끔씩 만 실행되는 쿼리를 실행하고 있다고 생각합니다. 이전 쿼리 계획을 다시 사용하지 않도록 SQL Server를 강제 실행하는 것이 좋습니다. 이 답변 그 방법에 대한 자세한 내용은 /를 참조하십시오.

세 번째 문제는 이미 다루었지만 Sql Server Management Studio를 사용하여 수동으로 쿼리를 실행하여 쿼리를 조정해야하는지 여부를 쉽게 결정할 수 있습니다. 쿼리를 완료하는 데 너무 오래 걸리면 통계를 재설정 한 후에도 조정해야 할 수 있습니다. 도움이 필요하면 정확한 질문을 새 질문에 게시해야합니다.

301
Marnix van Valen

저장 프로 시저를 실행하는 코드에서 다음과 같은 것이 있어야합니다.

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

다음과 같은 코드 행을 추가하십시오.

c.CommandTimeout = 0;

이렇게하면 작업이 완료 될 때까지 필요한 시간만큼 대기합니다.

135
Elastep

장기 실행 SQL 트랜잭션을 허용하도록 SQL 명령의 CommandTimeout 속성을 설정할 수 있습니다.

또한 시간 초과를 유발하는 SQL 쿼리를 조사해야 할 수도 있습니다.

23
Kev Ritchie

이전의 모든 답변이 모든 문제를 다루지는 못했지만 문제를 다루었습니다.

Microsoft는이 문제를 인정하고 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 어셈블리를 업데이트해야 할 수도 있습니다.

이 문제는 미러 된 데이터베이스에 대한 연결 다시 시도 알고리즘의 오류로 인해 발생합니다.

Retry-algorithm이 사용되면 데이터 공급자는 첫 번째 읽기 (SniReadSync) 호출이 완료 될 때까지 대기합니다. SQL Server를 실행하는 백 엔드 컴퓨터로 호출이 보내지고 대기 시간은 연결 시간 제한 값에 0.08을 곱하여 계산됩니다. 그러나 응답이 느리고 대기 시간이 만료되기 전에 첫 번째 SniReadSync 호출이 완료되지 않으면 데이터 공급자가 운명이 잘못된 상태로 연결을 잘못 설정합니다.

자세한 내용은 KB 2605597을 참조하십시오.

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

12
matcheek

어쩌면 그것은 누군가에게 유용 할 것입니다. 나는 같은 문제에 직면했고 나의 경우 SqlConnection이 열리고 약 2500 번의 반복으로 루프에서 호출 된 메서드에 처리되지 않았기 때문입니다. 연결 풀을 모두 소진했습니다. 적절한 처분으로 문제가 해결되었습니다.

9
eternity

나는 3 일경에 같은 문제에 직면했다. 우리 기록의 수가 많지 않아서 상급 개발자가 2 개의 이미지와 지문을 데이터베이스에 보관하고있는 것으로 나타났습니다. 오랜 시간이 걸리는이 16 진수 값을 가져 오려고하면 약 38 초 내 프로 시저를 실행하는 평균 시간을 계산합니다. 기본 명령 시간 초과는 30 초이므로 내 저장 프로 시저를 실행하는 데 필요한 평균 시간보다 짧습니다. 나는 아래처럼 내 명령 시간을 정했다.

cmd.CommandTimeout = 50

그리고 잘 작동하지만 때로는 쿼리에 50 초 이상 걸리면 같은 오류가 표시됩니다.

6
Vijay Kumbhoje

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; }
}
5
Siddarth Kanted

최근에이 오류가 발생하여 간단한 조사를 거친 후 데이터베이스를 보유하고있는 디스크의 공간이 부족한 원인을 발견했습니다 (1GB 미만).

같은 데이터베이스의 데이터베이스 (.mdf 및 .ldf)를 같은 서버의 다른 디스크 (더 많은 공간이있는)로 이동하자마자 3 초 내에로드 된 동일한 페이지 (쿼리 실행)가 시간 초과되었습니다.

이 오류를 해결하려고 할 때 조사해야 할 또 하나의 점은 데이터베이스 로그 파일의 크기입니다. 로그 파일을 축소해야 할 수도 있습니다.

4
Hafiz Adewuyi

큰 시간이 걸리는 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;
    }
3
Nabeel Iqbal

@SilverLight .. 이것은 분명히 Database 객체의 문제입니다. 잘못 작성된 쿼리이거나 누락 된 인덱스 일 수 있습니다. 하지만 지금은 데이터베이스 개체에 대한 문제를 조사하지 않고 시간 제한을 늘리라고 제안하지 않습니다.

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

이 코드 줄에 중단 점을 넣어 프로 시저 이름을 찾은 다음 실행 계획을보고 프로 시저를 최적화합니다.

저장 프로 시저에 대한 세부 정보를 게시 할 때까지는 더 이상 당신을 도울 수 없습니다.

2
Amit Rai Sharma

시험

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

그런 다음 색인을 다시 작성하십시오.

1
maksoud

TLDR :

  1. 데이터 볼륨, 네트워크 설정 및 코드가 변경되지 않은 가장 빠른 수정은 응용 프로그램과 DB 서버를 모두 재부팅하는 것입니다. 우리는 항상 원칙적으로 그렇게합니다
  2. 교체가 필요한 하드 드라이브 고장 표시 일 수 있음-시스템 알림 확인

여러 가지 이유로이 오류가 자주 발생했으며 다음과 같은 다양한 솔루션이 있습니다.

  1. 사용할 코드를 리팩토링 SqlBulkCopy
  2. 다양한 답변에 명시되거나 근본 원인 확인 (이 데이터 관련이 아닐 수 있음 )
  3. 연결 시간 초과 (기본값 15 초)-TCP/PORT 관련-종료 전에 SQL Server와의 연결이 완료 될 때까지 걸리는 시간 - 문제 해결 검사 목록 (매우 편리한 MSDN 기사)
  4. 명령 시간 초과 (기본값 30 초)-쿼리 실행을 기다리는 데 걸리는 시간-쿼리 실행/네트워크 트래픽 관련- 또한 문제 해결 프로세스가 있음 (다른 편리한 MSDN 기사)
  5. 서버 및 응용 프로그램 및 DB 서버 (별도의 경우) 모두 재부팅-코드와 데이터가 변경되지 않은 환경은 변경되어야합니다.-가장 먼저해야 할 일입니다. 일반적으로 패치 (운영 체제, .Net Framework 또는 SQL Server 패치 또는 업데이트)로 인해 발생합니다. 특히 시간 초과 예외가 아래와 같이 나타나는 경우 (Azure를 사용하지 않더라도) :
    • System.Data.Entity.Core.EntityException : 일시적인 오류로 인해 예외가 발생했습니다. SQL Azure 데이터베이스에 연결하는 경우 SqlAzureExecutionStrategy를 사용해보십시오. ---> System.Data.Entity.Core.EntityCommandExecutionException : 명령 정의를 실행하는 동안 오류가 발생했습니다. 자세한 내용은 내부 예외를 참조하십시오. ---> System.Data.SqlClient.SqlException : 서버에서 결과를 수신 할 때 전송 레벨 오류가 발생했습니다. (제공자 : TCP 공급자, 오류 : 0-세마포 시간 초과 기간이 만료되었습니다.) ---> System.ComponentModel.Win32Exception : 세마포 시간 초과 기간이 만료되었습니다 .
0
user919426

SQL 쿼리가 sqlCommand.CommandTimeout 속성에서 설정 한 것보다 시간이 오래 걸리므로 제한 시간이 만료되었습니다.

분명히이 문제를 해결하기 위해 CommandTimeout을 늘릴 수 있지만 그 전에는 인덱스를 추가하여 쿼리를 최적화해야합니다. Sql 서버 관리 스튜디오에서 실제 실행 계획을 포함하여 쿼리를 실행하면 Sql 서버 관리 스튜디오가 올바른 인덱스를 제안합니다. 대부분의 경우 쿼리를 최적화 할 수 있으면 시간 초과 문제를 해결할 수 있습니다.

0
Khabir

기본 제한 시간은 15 초이며 변경하려면 0, 제한이없는 경우 다른 숫자는 초 수입니다.

코드 있음

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

Your Web.Config에서 "Command Timeout = 0;" 시간 초과하지 않거나 1 시간 미만 (3600 초)

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

또한 보류중인 거래가 없는지 확인하십시오. :)

나는 몇 가지 테스트를하고 있었고 안전한 거래를 시작했지만 결코 닫지 않았습니다. 나는 오류가 더 명백해 졌으면 좋겠다.

0
JeromeJ