DBI: disconnect - question

房东的猫 提交于 2020-02-03 04:59:31

问题


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 die $DBI::errstr if $dbh;
}

回答1:


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.




回答2:


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.




回答3:


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.




回答4:


I don't think it is strictly necessary but I find it neater.



来源:https://stackoverflow.com/questions/5325036/dbi-disconnect-question

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!