2013-02-22 5 views
2

프로덕션 환경에서 실행되는 안정적인 웹 기반 단일 스레드/프로세스 perl 응용 프로그램이이 오류를 간헐적으로 던지기 시작했습니다. 과중한 시스템 부하에서만 가능합니다. 근본 원인을 파악할 수는 없습니다.Perl은 다음과 같이 사용합니다 : "사용법 : 전역 파괴 중 DBD :: Pg :: db :: DESTROY (dbh)"

Usage: DBD::Pg::db::DESTROY(dbh) during global destruction 

누구든지이 오류에 대한 설명을 제공 할 수 있습니까? Perl이 종료 전에 정리할 때 DESTROY가 인수없이 호출되면 (self?) Pg.sx에서 발생하는 것으로 보입니다. (나는 우리의 버전에서 구글을 통해 이전의 소스 코드에서 해당 메시지를 볼 수 있지만.) 우리의 환경 :

  • OS를 : FreeBSD의 8.3-STABLE
  • 펄 v5.14.2
  • DBD :: 대학원 v2를. 19.3
  • PostgreSQL의 : v9.2.3 여기
+0

코드에서 명시 적으로 DESTROY를 호출합니까? AUTOLOAD, 아마도? DBI의 어떤 버전입니까? – pilcrow

+0

@pilcrow - (죄송합니다. 이전에 귀하의 의견을 알리지 못했습니다.) DBI v1.623. 내 코드는 DESTROY를 호출하지 않거나 AUTOLOAD를 사용하지 않습니다. 프로세스가 완료된 것으로 보이고 Perl이 정리 중입니다.예외를 트래핑하는 신호 처리기가 있고 내 코드에서 실행되는 트랩 루틴을 보여주는 작은 스택 추적 (호출자())을 인쇄합니다 (실제 오류를 트랩 할 때 발생 함). – Allen

답변

2

는 어둠 속에서 기회입니다.

DBI 데이터베이스 핸들은 일반적으로 다른 오브젝트와 마찬가지로 파괴됩니다. 그러나 상황이 자연적으로 파괴되는 핸들을 방지 할 수 있습니다 :

  • 핸들은 글로벌 패키지 순환 참조
  • 핸들 양식 부분입니다 펄 수 자동으로 무료로하지

이런 객체 기본적으로 모든 것을 undefs하고 실질적으로 무작위 순서로 DESTROY을 호출하는 '글로벌 파멸'의 일부로서 파괴됩니다. 이것은 허위 오류를 일으키는 원인 일 수 있습니다.

먼저 스크립트의 시작과 끝에서 DB 핸들을 열거하고 끝 부분에서 아직 사용중인 것이 있는지 확인할 수 있습니다. this code snippet 참조 :

당신이 확실하지 않은 경우 개체가 여전히 사용 이유, 당신이 그들을 찾기 위해 몇 가지 큰 데이터 구조에 Devel::Cycle를 사용할 수 있습니다.

DBI의 tracing functionality도 유용 할 수 있습니다. 스크립트를 실행하기 전에 DBI_TRACE=2을 내 보내면 핸들을 만들거나 삭제할 때마다 기록됩니다.

+0

고마워, 대단한 대답이지만 내 시나리오 AFAIK에 맞지 않지만 여전히 고려 중이다. DB 추적() 시도했지만 정상적인 처리를 보여줍니다. 이것은 commit() 및 exit(); Perl이 정상적으로 정리할 것을 기대했습니다. 이 오류는 DESTROY()에 대한 인수가 없음을 의미합니까? 이것은 수년간 계속되었고 그 날 갑자기이 메시지를 분출하기 시작했습니다. – Allen

+0

종료 후에 정리해야하지만 데이터베이스 핸들을 유지하는 것이 무엇인지 의미하는 전역 대체가 수행되지 않았습니다. 전역 소멸은 소멸자가 호출되기 전에 dbh가 정의되지 않을 가능성이 있기 때문에 오류를 설명합니다. (!) 비록 내가 말했듯이, 이것은 어둠의 장면입니다. 코드가 변경되지 않았다면 아마도 DBD :: Pg가 업그레이드되었거나 데이터베이스 구성 (시간 초과?)이 변경되었을 것입니다. – rjh

1

내 경우에는 서버를 업그레이드 한 후에 발생하기 때문에 PostgreSql/Perl/DBD 버전의 특정 오류 인 것 같습니다.

이 오류는 명시 적으로 데이터베이스 핸들을 삭제하지 않는 모든 스크립트에서 갑자기 시작되었습니다. $dbx->disconnect()을 추가하면 해결되었습니다.

업데이트 :이 대안은 일부 스크립트에서만 오류를 수정했습니다. 다른 경우 데이터베이스 핸들을 명시 적으로 파기하는 경우에도 오류가 지속됩니다.