내 웹 사이트 (하루 20000-60000)에 많은 사용자가 있는데,이 파일은 모바일 파일 용 다운로드 사이트입니다. 서버 (Windows Server 2008-R2)에 원격으로 액세스 할 수 있습니다.
내가받은 “서버를 사용할 수 없습니다” 오류 전에,하지만 지금은 연결 시간 초과 오류를보고하고있다.
나는 이것에 익숙하지 않습니다-왜 발생하고 어떻게 해결할 수 있습니까?
전체 오류는 다음과 같습니다.
‘/’응용 프로그램에 서버 오류가 있습니다. 제한 시간이 만료되었습니다. 작업이 완료되기 전에 시간 초과 기간이 경과했거나 서버가 응답하지 않습니다. 그 진술서는 만료되었습니다. 설명 : 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 오류 및 코드에서 발생한 위치에 대한 자세한 정보는 스택 추적을 검토하십시오.
예외 정보 : 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, Boolean returnStream, Boolean async) +6389442
System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult 결과) +538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (DbAsyncResult 결과, 문자열 methodName, 부울 sendToPipe) +689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery () +327
NovinMedia.Data.DbObject.RunProcedure (String storedProcName, IDataParameter [] 매개 변수, Int32 및 rows 영향을 받음) +209
DataLayer.OnlineUsers.Update_SessionEnd_And_Online (Object Session_End, Boolean Online) +440
NiceFileExplorer.Global.Application_Start (오브젝트 송신자, EventArgs e) +163[HttpException (0x80004005) : 시간이 만료되었습니다. 작업이 완료되기 전에 시간 초과 기간이 경과했거나 서버가 응답하지 않습니다. 문이 종료되었습니다.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (HttpContext context, HttpApplication app) +4052053
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS (IntPtr appContext, HttpContext context, MethodInfo [] handlers) +191
System.Web.HttpApplication. InitSpecial (HttpApplicationState 상태, MethodInfo [] 처리기, IntPtr appContext, HttpContext 컨텍스트) +352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (IntPtr appContext, HttpContext context) +407
System.Web.Hosting.PipelineRuntime.InitializeApplication (IntPtr appContext) +375[HttpException (0x80004005) : 시간이 만료되었습니다. 작업이 완료되기 전에 시간 초과 기간이 경과했거나 서버가 응답하지 않습니다. 문이 종료되었습니다.]
System.Web.HttpRuntime.FirstRequestInit (HttpContext context) +11686928 System.Web.HttpRuntime.EnsureFirstRequestInit (HttpContext context) +141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate (IIS7WorkerRequest wr, HttpContext context) +4863749
ANSWERS AFTER 편집 :
내 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 bit
As
Begin
Update OnlineUsers
SET
[Session_End] = @Session_End,
[Online] = @Online
End
온라인 사용자를 유치하는 두 가지 방법이 있습니다.
- 사용
Application["OnlineUsers"] = 0;
- 데이터베이스를 사용하는 다른 하나
따라서 방법 # 2의 모든 온라인 사용자를에서 재설정했습니다 Application_Start
. 해당 테이블에 482,751 개가 넘는 레코드가 있습니다.
답변
예상보다 오래 걸리는 쿼리가있는 것 같습니다. 스택 추적과 코드에서 정확히 어떤 쿼리인지 확인할 수 있어야합니다.
이 유형의 시간 초과에는 세 가지 원인이있을 수 있습니다.
- 어딘가에 교착 상태가 있습니다
- 데이터베이스의 통계 및 / 또는 쿼리 계획 캐시가 잘못되었습니다
- 쿼리가 너무 복잡하여 조정해야합니다.
교착 상태는 해결하기 어려울 수 있지만 그 경우에 해당하는지 쉽게 판단 할 수 있습니다. Sql Server Management Studio를 사용하여 데이터베이스에 연결하십시오. 왼쪽 분할 창에서 서버 노드를 마우스 오른쪽 단추로 클릭하고 활동 모니터를 선택 하십시오 . 실행중인 프로세스를 살펴보십시오. 일반적으로 대부분 유휴 상태이거나 실행 중입니다. 문제가 발생하면 프로세스 상태별로 차단 된 프로세스를 식별 할 수 있습니다. 프로세스를 마우스 오른쪽 버튼으로 클릭하고 세부 정보를 가 마지막으로 실행 한 쿼리가 표시됩니다.
두 번째 문제는 데이터베이스가 차선의 쿼리 계획을 사용하게합니다. 통계를 지우면 해결할 수 있습니다.
exec sp_updatestats
그래도 작동하지 않으면 시도해 볼 수도 있습니다
dbcc freeproccache
서버에 과부하가 걸리면 저장된 모든 procs와 쿼리가 처음 실행될 때 다시 컴파일되므로 일시적으로 큰 성능 저하가 발생하기 때문에이 작업을 수행하지 않아야합니다. 그러나 문제가 때때로 발생 하고 스택 추적에 따라 응용 프로그램이 시작되고 있음을 나타내므로 때때로 실행되는 쿼리를 실행하고 있다고 생각합니다. SQL Server가 이전 쿼리 계획을 재사용하지 않도록 강요하면 더 나을 수 있습니다. 이를 수행하는 방법에 대한 자세한 내용 은 이 답변 을 참조하십시오 .
이미 세 번째 문제를 다루었지만 Sql Server Management Studio와 같은 쿼리를 수동으로 실행하여 쿼리를 조정해야하는지 여부를 쉽게 확인할 수 있습니다. 쿼리를 완료하는 데 시간이 너무 오래 걸리면 통계를 재설정 한 후에도 조정해야합니다. 이에 대한 도움을 받으려면 정확한 질문을 새 질문에 게시해야합니다.
답변
저장 프로 시저를 실행하는 코드에는 다음과 같은 내용이 있어야합니다.
SqlCommand c = new SqlCommand(...)
//...
이러한 코드 줄을 추가하십시오.
c.CommandTimeout = 0;
작업을 완료하는 데 필요한 시간만큼 기다립니다.
답변
당신은 설정할 수 있습니다 CommandTimeout
장기 실행 SQL 트랜잭션을 허용하도록 SQL 명령 특성을 있습니다.
시간 초과를 일으키는 SQL 쿼리를 봐야 할 수도 있습니다.
답변
이전의 모든 답변이 문제를 해결하지만 모든 경우를 다루지는 않았습니다.
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 어셈블리를 업데이트해야 할 수도 있습니다.
미러 된 데이터베이스에 대한 연결 재시도 알고리즘의 오류로 인해이 문제가 발생합니다.
재시도 알고리즘이 사용되면 데이터 공급자는 첫 번째 읽기 (SniReadSync) 호출이 완료 될 때까지 기다립니다. 호출은 SQL Server를 실행하는 백 엔드 컴퓨터로 전송되며 대기 시간은 연결 시간 제한 값에 0.08을 곱하여 계산됩니다. 그러나 응답이 느리고 대기 시간이 만료되기 전에 첫 번째 SniReadSync 호출이 완료되지 않으면 데이터 공급자가 운명 상태로의 연결을 잘못 설정합니다.
자세한 내용은 KB 2605597을 참조하십시오.
답변
아마도 누군가에게 유용 할 것입니다. 나는 같은 문제에 직면했고 내 경우에는 SqlConnection이 열렸고 약 2500 회 반복하여 루프에서 호출 한 메소드에 배치되지 않았기 때문입니다. 연결 풀이 소진되었습니다. 적절한 처분은 문제를 해결했습니다.
답변
나는 약 3 일 동안 동일한 문제에 직면했다. 우리의 레코드 수가 많지 않기 때문에 선임 개발자가 데이터베이스에 2 개의 이미지와 지문을 유지합니다. 오랜 시간이 걸리는이 16 진수 값을 가져 오려고하면 약 38 초 동안 프로 시저를 실행하는 평균 시간을 계산합니다. 기본 commandtimeout은 30 초이므로 저장 프로 시저를 실행하는 데 필요한 평균 시간보다 짧습니다. 아래와 같이 명령 시간 초과를 설정했습니다.
cmd.CommandTimeout = 50
제대로 작동하지만 때로는 쿼리에 50 초 이상이 걸리면 동일한 오류가 표시됩니다.
답변
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; }
}