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 会为您清理,但最好将您的数据库句柄传递给函数,而不是每次都重新创建它并立即销毁它。

有几件事需要注意,但使用 undef 不是其中之一

  • 如果您的进程 运行 一整天,那么您应该继续检查连接是否仍然有效。您可以使用 $dbh->ping

  • 您应该 prepare 每个陈述只一次。之后你可以使用不同的绑定参数多次执行它

  • 如果您在没有获取其所有数据的情况下留下 SELECT 语句句柄,那么您应该调用 $sth->finish 来重置它

你的pseudo-code很有限,解释不多。特别是我不明白配置文件(数据文件)如何为您创建数据库句柄。因为您需要检查数据库连接是否仍处于活动状态,所以您还需要能够在必要时重新连接。如果这是在 "config file" 中完成的,那么我认为您需要重新设计您的设计

这是我认为它应该如何工作的一个更加波斯语的 pseudo-code 示例。每次 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;
}