在DBI perl中清除语句处理程序

时间:2017-02-07 06:45:55

标签: perl sybase dbi resource-cleanup

我正在使用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所示。这有必要吗?

2 个答案:

答案 0 :(得分:0)

Perl将为您清理,但最好将db句柄传递给函数,而不是每次都重新创建它并立即销毁它。

答案 1 :(得分:0)

有几点需要注意,但使用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;
}