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;
}
我正在使用 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;
}