[英]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.