2012-05-20 2 views
1

mod_perl을 스트레스 테스트 할 때 데이터베이스 연결이 끊어 질 때 문제가 발생했습니다. 프로세스가 데이터베이스 연결을 공유하여 문제를 일으킨 것으로 의심됩니다.mod_perl로 새 데이터베이스 핸들 만들기

하지만 Apache :: DBI에 대한 모든 지침을 따라 왔으며이를 이해할 수 없습니다.

나는 startup.pl이 아니라 자식 프로세스에서 연결을 만들고 있습니다. 그러나 DBI-> connnect에서 각 자식이 반환 한 $ dbh를 조사 할 때 주소는 모든 httpd 프로세스에서 동일합니다. 첫째, 이것이 제대로 작동하고 각 프로세스에 대해 다시 연결하는 경우 DBI-> connect에 의해 반환 된 주소가 각 하위 프로세스마다 다르게해야합니까? 나는 그렇게 생각했지만 DBI의 핵심 C 코드 (dbih_setup_handle)가이를 관리하고 동일한 주소를 반환한다고 말할 수있는 한. 어쩌면 나는 아이에게 다시 연결된다는 것이 무엇을 의미하는지 이해하지 못할 수도 있습니다.

$ dbh 핸들이 동일하면 올바르게 다시 연결합니까?

+0

교차 게시 : http://www.perlmonks.com/?node_id=971450 – lschult2

답변

0

시작 구성의 <perl>...</perl> 섹션이나 시작시로드 된 모듈에서 데이터베이스 연결을 설정하고 forked 프로세스가 사용하려고 시도 할 때까지 계속 유지하는 것처럼 들립니다.

불행히도이 문제를 해결할 수 없습니다. 어떻게하면 새로운 프로세스가 새로운 연결을 얻는 지 확인해야 할 것입니다.

이 문제에 대한 해결책은 연결이 설정되었을 때 $$ (현재 프로세스 ID)을 추적하는 dbh를 얻는 데 핵심적인 역할을했습니다. 것 데이터베이스를 사용하고 싶었

my $_dbh; 
my $pid; 

sub dbh { 
     if($pid != $$) { 
       $_dbh = DBI->connect(...); 
       $pid = $$; 
     } 
     return $_dbh; 
} 

코드 : 연결을 넘겨 때 경우 함수는 변경했다 $$, 그것은 새로운 하나를 그들에게을 닫지 않고 기존 연결 처분 만들 것을 발견 먼저 dbh()을 호출하여 데이터베이스 핸들을 얻은 다음 필요한 경우 새 데이터베이스를 만들거나 사용 가능한 경우 이전에 설정된 연결을 넘겨 줘야합니다.

+0

Michael,이 문제를 피하기 위해 startup.pl에서 연결을 설정하지 않았습니다. 모든 연결은 자녀에 의해 설정됩니다. 그러나 각 어린이의 $ dbh 주소를 검토 할 때 주소는 동일합니다. 그러나 그것들은 자식과 관련된 가상 주소이기 때문에 연결이 공유되고 있다는 것을 의미 할 수도 있고 아닐 수도 있습니다. 이것이 내가 알아 내려고하는 것입니다. 연결이 공유되지 않는 것을 어떻게 확인할 수 있습니까? – lschult2

+3

fork 된 하위 서버 프로세스가 모두 데이터베이스 핸들을 여는 지점까지 똑같이 작동하면 동일한 주소를 가지지 만 별도의 프로세스 메모리 공간에 있으므로 문제가되지 않습니다. –

+0

그러면이 질문에 대답합니다. $ dbh가 같은 주소를 가지고 있더라도 올바르게하고있다. ab 스트레스 테스트는 실패하지 않음으로이를 확인합니다. ("답변"으로 마이클의 의견을 선택하는 방법을 모르겠습니다) – lschult2