DBI:断开 - 问题

时间:2011-03-16 12:09:44

标签: sql perl dbi disconnect

您是否会将disconnect代码的某些部分称为线路噪音,还是将其保留原样?

use DBI;

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

4 个答案:

答案 0 :(得分:3)

如果您在执行完所有工作后退出程序,则不必严格断开与数据库的连接。但这是一个好主意,特别是在您执行多个连接或将执行多个顺序连接的程序中。

有关详细信息,请参阅Programming the Perl DBI

答案 1 :(得分:2)

小心点。如果禁用AutoCommit并且根据是否断开连接而不提交,则可以遇到一些有趣的情况:

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");'

由于DESTROY而发出rollback()而没有DBD :: ODBC :: db handle test的显式disconnect()。

注意,因为没有显式断开连接,所以插入回滚,我们收到错误。

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;'

这里似乎没有任何错误,即使没有调用commit但是行没有进入数据库。因此,断开连接掩盖了未提交行的事实。

答案 2 :(得分:0)

在剧本结束时,它可能并不重要。然而,无论如何,添加它可能是值得的,只是为了明确清理自己。它肯定不会受到伤害,我怀疑可能会有一些情况肯定会有所帮助。

答案 3 :(得分:0)

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