如何断开与所有数据库连接字符串

时间:2016-08-01 11:56:40

标签: perl database-connection dbi disconnect

我有一个Perl脚本,它使用不同的连接驱动程序连接到许多数据库。

如果有任何活动会话,我有什么方法可以编写单个断开连接功能以断开连接?

示例:

connection 1: $dbh->oracle;
connection 2: $dbh->sql

我可以为两个数据库都有一个公共的断开字符串吗?

2 个答案:

答案 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()

这意味着您正在使用交易。最好的方法是自己致电rollbackcommit来结束交易。当您依赖数据库驱动程序的默认行为时,在程序终止时保持事务处于打开状态是个坏主意

documentation for DBI::disconnect说明了这个

  

通常,如果您希望在断开连接时提交或回滚更改,则应在断开连接之前显式调用“commit”或“rollback”。

如果您在交易仍未结束时致电disconnect,也会收到相同的警告,因此commitrollback绝对是正确的方法

只要当时没有任何事务处于打开状态,Perl的销毁序列就会破坏所有数据库句柄,这是可以的。