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