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