我有一个Perl脚本,它使用不同的连接驱动程序连接到许多数据库。
如果有任何活动会话,我有什么方法可以编写单个断开连接功能以断开连接?
示例:
connection 1: $dbh->oracle;
connection 2: $dbh->sql
我可以为两个数据库都有一个公共的断开字符串吗?
答案 0 :(得分:4)
您可以使用visit_handles
from DBI自行实现。
use strict;
use warnings;
use DBI;
my $dbh = DBI->connect( 'DBI:mysql:database=test;host=localhost', 'root', 'pw' );
my $dbh2 = DBI->connect( 'DBI:mysql:database=test;host=localhost', 'root', 'pw' );
DBI->visit_handles(
sub {
my ( $driver_handle, $info ) = @_;
if ($driver_handle->{Type} eq 'db') {
# clean up transaction or simply disconnect for each handle
$driver_handle->disconnect;
}
return 1;
}
);
将为每个驱动程序句柄调用传递给visit_handles
的代码引用。如果它返回一个真值,它将随后使用相同的代码引用调用visit_child_handles
。这样,您可以匹配哪些是数据库句柄(db
)并明确断开它们。
作为Borodin states in their answer,您需要在断开连接之前处理半成品事务。此解决方案仅为您提供了从单个位置获取所有连接句柄的方法。
答案 1 :(得分:2)
每个数据库连接都将表示为单独的数据库句柄$dbh
显然,只要您连接的数据库列表始终相同,您就可以编写一个与所有连接的数据库句柄断开连接的子例程
我不确定你为什么要关注连接字符串。大概是指您在调用DBI->connect
时使用的DSN(数据源名称)?它们只是连接操作的参数,并且在从原始DSN
Issuing rollback() due to DESTROY without explicit disconnect()
这意味着您正在使用交易。最好的方法是自己致电rollback
或commit
来结束交易。当您依赖数据库驱动程序的默认行为时,在程序终止时保持事务处于打开状态是个坏主意
documentation for DBI::disconnect
说明了这个
通常,如果您希望在断开连接时提交或回滚更改,则应在断开连接之前显式调用“commit”或“rollback”。
如果您在交易仍未结束时致电disconnect
,也会收到相同的警告,因此commit
或rollback
绝对是正确的方法
只要当时没有任何事务处于打开状态,Perl的销毁序列就会破坏所有数据库句柄,这是可以的。