2013-11-28 2 views
1

약 48 분 후에 시간이 초과되는 장기 실행 쿼리가 있습니다.제한 시간 내에 쿼리가 시간 초과되는 이유는 무엇입니까?

명령 시간 제한은 2 시간으로 설정되고 연결 시간 제한은 17 분으로 설정됩니다.

쿼리가 시간 초과를 발생시키는 원인은 무엇입니까? (내가 간과 한 다른 뭔가가 있어야 겠지?)

Npgsql.NpgsqlException: 
    A timeout has occured. If you were establishing a connection, increase Timeout value in ConnectionString. If you were executing a command, increase the CommandTimeout value in ConnectionString or in your NpgsqlCommand object. 
     at Npgsql.NpgsqlState.ProcessBackendResponsesEnum(NpgsqlConnector context) in C:\projects\Npgsql2\src\Npgsql\NpgsqlState.cs:line 384 
     at Npgsql.NpgsqlCommand.GetReader(CommandBehavior cb) in C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:line 611 
     at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior cb) in C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:line 591 
     at Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior) in C:\projects\Npgsql2\src\Npgsql\NpgsqlCommand.cs:line 538 

추가 정보 :

  • 포스트 그레스 버전 : 8.3
  • NpgSql : 2.0.11.0

포스트 그레스 로그에 다음 "오류"가 표시됩니다.

cancelling statement due to user request 

동일한 검색어로 실패한 시간과 동일한 시간 ("00 : 48 : 24.909" 및 "00 : 48 : 24.936")을 실행 한 후 서로 다른 시간대에 대해 서로 다른 시간대에 두 번 쿼리가 실행되었습니다. "

또한 이전 쿼리는 00:47:40보다 오래 걸리지 않았으므로 다른 이유로 인해 약 48 분이 지나면 시간 제한이 발생합니다.

나는 postgres 설정 파일에서 아무것도 볼 수 없으며, 내가 볼 수있는 곳이 다른가요?

+1

PostgreSQL 버전, nPgSQL 버전, 명령 텍스트 및 서버 오류 로그 출력? 추측하면 _network_ timeout (아마도 NAT 연결 추적 만료 문제를 통해 얻을 수 있습니까?) 명령문 시간 초과가 아닙니다.어쨌든, 해당 정보를 추가 할 질문을 편집하면 여기에 의견을 남기십시오. –

+0

Postgres 8.3, NpgSql 2.0.11.0 (버전을 변경할 수 없음), 명령 텍스트를 제공 할 수 없으며 로그 용 데이터베이스 서버에 액세스 할 수 없습니다. 서버와 db는 전용 스위치의 데이터 센터에 있습니다. 타임 아웃은 클라이언트가 얼마나 오랜 시간이 걸릴지에 의해 제어되었지만? 더 이상 실행되지 않고 시간 초과되지 않는 다른 쿼리가 있습니다. –

+0

그런 경우 - nPgSQL 스택 추적에 더 많은 것이 있습니까? Java에서와 같이 "원인 ..."이 있습니까? 귀하의 입장에서 나는 (a) DBA에게 로그를 요청하고, (b) 가능한 한 많은 nPgSQL 로깅 추적을 가능하게합니다. 및/또는 (c) Wireshark를 사용하여 네트워크 통신을 검사하고 진행 상황을 정확하게 확인하십시오. –

답변

2

Npgsql의 버그입니다. 방금 확인 했어. fixed on 03/10/2013 이었지만 그 이후로는 안정적인 릴리스가 없습니다. 현재이 문제를 해결하려면 현재 소스에서 빌드해야합니다.

Socket.Poll()이 Int32 마이크로 초 인수를 취하고 Socket.Poll() 자체에 버그가있는 것의 조합으로 인해 발생합니다.

먼저 2 시간은 -1389,934,592 마이크로 초 (7200 초 * 1,000,000)로 변환되며 절대 값은 약 48 분입니다.

둘째, Socket.Poll() documentation 주 : 당신이 응답을 무한정 기다릴 것인지

는 음의 정수로 마이크로 매개 변수를 설정합니다.

대신 절대 값으로 변환되는 것처럼 보입니다 (약 48 분). 이상하지만 예측 가능한 시간 초과가 있습니다.

+0

제작 준비가 된 환경에서 사용하고 있습니다. 무작위로 스트레스를 받으면서 그러한 오류가 무작위로 발생했습니다. 또는 일부 요청이 영원히 사라졌습니다. 아무 스트레스도없이 결코 오류가 없었습니다. 이상한 – GorillaApe

0

왜 이것이 대답인지, 아마도 NpgSQL의 버그 일지 확실하지 않습니다. 또한 CommandTimeOut을 48 분에 만드는 이유에 대해 설명 할 수 없습니다 (이 코드는 기본값으로 지정해야하지만 내 코드에는 맞지 않습니다. documentation에 지정된대로 20 초로 기본 설정하지 않는 것이 이상합니다).

그러나이 문제를 해결하려면 연결 개체 대신 쿼리를 실행하기 전에 명령 개체 자체에서 CommandTimeOut을 설정해야합니다.

관련 문제