簡體   English   中英

在DBI Perl中清理語句處理程序

[英]Cleanup of statement handlers in DBI perl

我正在使用DBI perl連接Sybase數據服務器。 我的流程執行以下全天循環運行的循環

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;
}

現在,由於這將全天運行,因此在資源清理方面我需要牢記一些事情。

目前,我正在每個函數后面執行undef $sth ,如someAnotherPerlFunctionOne中所示。 那有必要嗎?

Perl將為您進行清理,但是最好將db句柄傳遞給函數,而不是每次都重新創建它並立即銷毀它。

需要注意一些事情,但是使用undef並不是其中之一

  • 如果您的進程全天運行,則應繼續檢查連接是否仍然有效。 您可以使用$dbh->ping

  • 每個語句只prepare一次。 之后,您可以使用不同的綁定參數多次執行它

  • 如果您在不獲取所有數據的情況下留下了SELECT語句句柄,則應調用$sth->finish來重置它

您的偽代碼非常有限,並且解釋不多。 特別是我不明白配置文件(數據文件)如何為您創建數據庫句柄。 因為您需要檢查數據庫連接是否仍處於活動狀態,所以還需要能夠在必要時重新連接。 如果在“配置文件”中完成,那么我認為您需要重新設計

這是我認為應該如何工作的一個相當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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM