2017-02-07 12 views
0

DBI perl을 사용하여 Sybase dataserver와 연결합니다. 내 공정이 하루 동안 실행됩니다 주어진 일 지금DBI perl에서 명령문 처리기 정리

Till end of day, do { 
    $sth = $dbh->prepare 
    execute query 
    someAnotherPerlFunction() 
    someAnotherPerlFunctionOne() 
} 

someAnotherPerlFunction() 
{ 
    $sth = $dbh->prepare (select) 
    execute query 
} 

someAnotherPerlFunctionOne() 
{ 
    my $sth = undef; 
    $sth = $dbh->prepare (update) 
    execute query; 
    undef $sth; 
} 

에 걸쳐 실행 루프에서 다음을 수행합니다, 나는 자원 정리의 관점에서 염두에 두어야 할 점들은 무엇인가.

현재 someAnotherPerlFunctionOne에 표시된대로 각 함수 다음에 undef $sth을 수행하고 있습니다. 그게 필요한가요?

+3

someAnotherPerlFunctionOne의 undef는 필요하지 않습니다. 함수의 내부에서 정의 된 변수는 일단 범위를 벗어나면 undef입니다. – user3606329

+2

데이터베이스의 핸들 ($ dbh)이 더 중요합니다. 결국 코드에서 AutoCommit이 꺼져 있거나 지속적인 연결을 유지하지 않으면 $ dbh-> disconnect를 호출 할 수 있습니다. – user3606329

+0

왜이 질문을합니까? 프로그램에 문제가 있습니까? 그렇다면 문제를 설명하고 그렇지 않으면 그대로 두십시오. – Borodin

답변

0

Perl이 정리할 것이지만, 매번 다시 작성하고 즉시 삭제하는 대신 db 핸들을 함수에 전달하는 것이 좋습니다.

+0

감사. 나는이 하나에 포함 된 다른 설정 파일에 creatign dbhandler입니다. 그러므로 나는 dbh를 반복해서 만들지 않을 것이다. – Kraken

+0

@Kraken : *** 핸들 ***입니다. A * 처리기 *는 완전히 다른 것입니다. – Borodin

+0

@Borodin dbh가 올바른 핸들입니까? 그것은 내가 별도의 구성에서 지정하는 것입니다. – Kraken

0

이 피려 할 몇 가지 있지만, 프로세스가 하루 종일 실행 한 다음 연결이 여전히 살아 있는지 계속 확인해야하는 경우 undef를 사용하여 그들 중 하나

  • 없습니다. 너는 $dbh->ping

  • 을 사용하여 할 수있다 각 문은 한 번만 prepare이어야한다. 혹시 당신이이

귀하의 의사 코드를 재설정 $sth->finish를 호출해야합니다 모든 데이터를 가져 오는없이 SELECT 명령문 핸들을두면 그 후 서로 다른 바인딩 매개 변수

  • 으로 여러 번 실행할 수 있습니다 매우 제한적이며 많은 것을 설명하지 않습니다. 특히 설정 파일 (데이터 파일)이 데이터베이스 핸들을 생성하는 방법을 이해하지 못합니다. 데이터베이스 연결이 여전히 활성 상태인지 여부를 확인해야하므로 필요할 때마다 다시 연결할 수 있어야합니다. 그것이 "설정 파일"에서 완료된다면 당신은 당신의 디자인을 다시 작성해야한다고 생각합니다.

    어떻게하면 좋을지에 대한 좀 더 많은 Perlish 의사 코드 예제가 있습니다. until ($end_of_day) 루프가 발생할 때마다 먼저 데이터베이스 핸들이 유효한지 여부를 확인해야합니다. 거기 다음 당신이 연결을 설정하고 prepare 당신의 문을 모두 그 후

    을 처리해야하는 시점 인 경우, 데이터베이스 핸들 및 서브 루틴 명령문 핸들을 모두 통과하는 것이 가장 좋습니다. 각 문 핸들에 대해 prepare이 완료되면 두 서브 루틴이 동일한 코드로 축소됩니다.

    이 내용은 많이 작성해야하지만 응용 프로그램에 대해서는 거의 알지 못합니다. 도움이 되었기를 바랍니다.

    use DBI; 
    
    my $dbh; 
    
    until ($end_of_day) { 
    
        my ($sth, $select, $update); 
    
        until ($dbh and $dbh->ping) { 
    
         $dbh = DBI->connect(...); 
    
         if ($dbh) { 
          $select = $dbh->prepare('SELECT ...'); 
          $update = $dbh->prepare('UPDATE ...'); 
          $sth = $dbh->prepare('SOME SQL'); 
          last; 
         } 
    
         sleep 10; # Wait before retrying 
        } 
    
        $sth->execute(); 
        someAnotherPerlFunction($dbh, $select); 
        someAnotherPerlFunctionOne($dbh, $update); 
    } 
    
    someAnotherPerlFunction { 
        my ($dbh, $sth) = @_; 
        $sth->execute; 
    } 
    
    someAnotherPerlFunctionOne { 
        my ($dbh, $sth) = @_; 
        $sth->execute; 
    } 
    
  • +0

    감사합니다. 필자는 Perl 스크립트를 시작할 때 $ FindBin :: Bin/dbconfig.pl ";을 요구하고 dbconfig에서 dbh = DBI-> connect를 사용하고 있습니다. – Kraken

    +0

    @Kraken : 그건 사실 설정 파일이 아니며, 이는 모두 데이터 * 상수를 설정하는 데 관한 것입니다. 거기에서'use constant'를 사용하여 DSN, 사용자 이름 및 암호를 설정할 수 있지만, 데이터베이스 연결을 반복적으로 점검하고 필요에 따라 하루 종일 다시 연결할 수 있어야합니다. 적절한 Perl 모듈과 ['Exporter'] (https://metacpan.org/pod/Exporter)를 사용하여 값을 다시 주 프로그램으로 전달하는 것이 좋습니다. – Borodin