DBI: disconnect - question
Would you call parts of the disconnect
-code as line-noise or would you leave it as it is?
use DBI;
my $dbh = DBI->connect ...
...
...
END {
$dbh->disconnect or d开发者_StackOverflow中文版ie $DBI::errstr if $dbh;
}
Explicit disconnection from the database is not strictly necessary if you are exiting from your program after you have performed all the work. But it is a good idea, especially in programs in which you have performed multiple connections or will be carrying out multiple sequential connections.
See Programming the Perl DBI for more info.
Be careful. You can hit some interesting situations if you disable AutoCommit and don't commit depending on whether you 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");'
Issuing rollback() due to DESTROY without explicit disconnect() of DBD::ODBC::db handle test.
Note, because there was no explicit disconnect the insert was rolled back and we got an error.
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;'
Here it appears there is nothing wrong even though commit was not called but the rows did not get into the database. So the disconnect masked the fact the rows were not committed.
At the end of the script, it probably doesn't matter much. However it might be worth it to add it anyway just to explicitly clean up after yourself. It certainly won't hurt and I suspect there might be a few situations where it will definitely help.
I don't think it is strictly necessary but I find it neater.
精彩评论