2011-03-16 126 views
7

你能否将disconnect-代码的部分内容作为线路噪声调用,还是将它保留原样?如果你是从你的程序退出已完成所有工作后,从数据库DBI:disconnect - question

use DBI; 

my $dbh = DBI->connect ... 
... 
... 
END { 
    $dbh->disconnect or die $DBI::errstr if $dbh; 
} 
+1

至少,使用RaiseError或HandleError,你不需要'或死...' – runrig 2011-03-16 14:45:15

回答

3

明确断开不是绝对必要的。但这是一个好主意,尤其是在执行多个连接或将执行多个顺序连接的程序中。

有关更多信息,请参阅Programming the Perl DBI

+0

链接已经死亡。这里有一个链接,当它最后有内容时它看起来像什么。 https://web.archive.org/web/20141018180208/http://oreilly.com/catalog/perldbi/chapter/ch04.html – Karl 2016-01-05 18:42:25

0

在脚本结束时,它可能没有多大关系。不过,无论如何,只要明确地清理一下就可以了。它肯定不会受到伤害,我怀疑可能会出现一些肯定会有所帮助的情况。

2

要小心。

perl -le 'use DBI;my $h = DBI->connect("dbi:ODBC:test","test","test", {AutoCommit => 0, RaiseError=>1}); $h->do(q/insert into mje values(?, ?)/, undef, 1, "fred");' 

发行回滚()由于没有明确断开DBD :: ODBC :: DB手柄测试()来破坏:如果禁用自动提交,并根据您是否断开不承诺你可以打一些有趣的情况下, 。

请注意,因为没有明确的断开连接,插入被回滚,我们得到一个错误。

perl -le 'use DBI;my $h = DBI->connect("dbi:ODBC:test","test","test", {AutoCommit => 0, RaiseError=>1}); $h->do(q/insert into mje values(?, ?)/, undef, 1, "fred");$h->disconnect or die $DBI::errstr;' 

这里看起来没有错,即使提交没有被调用,但行并没有进入数据库。因此,断开连接掩盖了行未提交的事实。

0

我不认为这是绝对必要的,但我觉得它更整洁。