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

Perl 如何断开与所有数据库连接字符串的连接,perl,database-connection,dbi,disconnect,Perl,Database Connection,Dbi,Disconnect,我有一个Perl脚本,它使用不同的连接驱动程序连接到许多数据库 如果有任何活动会话,是否有任何方法可以在最后编写一个断开功能来断开连接 例如: connection 1: $dbh->oracle; connection 2: $dbh->sql 我可以为这两个数据库使用一个通用的断开连接字符串吗?您可以自己使用 对于每个驱动程序句柄,将调用传递给visit\u handles的代码引用。如果它返回一个真值,它随后将使用相同的代码引用调用。这样,您可以匹配哪些是数据库句柄(db),

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

如果有任何活动会话,是否有任何方法可以在最后编写一个断开功能来断开连接

例如:

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

我可以为这两个数据库使用一个通用的断开连接字符串吗?

您可以自己使用

对于每个驱动程序句柄,将调用传递给
visit\u handles
的代码引用。如果它返回一个真值,它随后将使用相同的代码引用调用。这样,您可以匹配哪些是数据库句柄(
db
),并显式断开它们的连接


因为在断开连接之前,您需要处理完成了一半的事务。此解决方案仅为您提供了一种从一个位置获取所有连接句柄的方法。

您可以自己使用

对于每个驱动程序句柄,将调用传递给
visit\u handles
的代码引用。如果它返回一个真值,它随后将使用相同的代码引用调用。这样,您可以匹配哪些是数据库句柄(
db
),并显式断开它们的连接

因为在断开连接之前,您需要处理完成了一半的事务。此解决方案仅为您提供了从一个位置获取所有连接句柄的方法。

每个数据库连接将表示为一个单独的数据库句柄
$dbh

很明显,只要连接的数据库列表始终相同,就可以编写一个与所有连接的数据库句柄断开连接的子例程

我不知道你为什么要关注连接字符串。您大概是指在调用
DBI->connect
时使用的DSN(数据源名称)?它们只是连接操作的参数,并且在从原始DSN中删除后无法识别数据库句柄

由于在没有显式断开连接的情况下销毁而发出回滚()
这意味着您正在使用事务。最好的方法是自己调用
rollback
commit
来结束事务。当程序终止时,由于依赖于数据库驱动程序的默认行为,让事务保持打开状态是个坏主意

政府是这样说的

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

如果在事务仍处于打开状态时调用
disconnect
,也会收到相同的警告,因此
commit
rollback
绝对是正确的方法

只要当时没有任何事务保持打开状态,就可以让Perl的销毁序列简单地断开所有数据库句柄

每个数据库连接将表示为一个单独的数据库句柄
$dbh

很明显,只要连接的数据库列表始终相同,就可以编写一个与所有连接的数据库句柄断开连接的子例程

我不知道你为什么要关注连接字符串。您大概是指在调用
DBI->connect
时使用的DSN(数据源名称)?它们只是连接操作的参数,并且在从原始DSN中删除后无法识别数据库句柄

由于在没有显式断开连接的情况下销毁而发出回滚()
这意味着您正在使用事务。最好的方法是自己调用
rollback
commit
来结束事务。当程序终止时,由于依赖于数据库驱动程序的默认行为,让事务保持打开状态是个坏主意

政府是这样说的

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

如果在事务仍处于打开状态时调用
disconnect
,也会收到相同的警告,因此
commit
rollback
绝对是正确的方法


让Perl的销毁序列简单地断开所有数据库句柄是可以的,只要此时没有任何事务保持打开状态

DBI将在语句句柄超出范围时为您隐式断开连接。@simbabque:我收到的错误是:由于没有显式断开()的销毁而发出回滚()..…我正在使用单独的断开连接函数来防止出现这种情况,但最好对所有字符串使用单独的断开连接函数。当语句句柄超出范围时,DBI将为您隐式断开连接。@simbabque:我收到的错误是:由于没有显式断开连接()的销毁而发出回滚()…我正在使用单独的断开连接函数来防止出现这种情况,但最好对所有字符串使用单个断开连接函数。很好。我不知道
访问\u句柄
。但是显式地对所有对象调用
disconnect
将产生与perl销毁程序时隐式断开连接相同的警告,并且您需要对具有打开事务的每个句柄执行
回滚
提交
。@borodin-hmm-true。回到电脑后我会编辑。@Borodin我不知道这一点,谢谢你提供的信息。我正在尝试连接不同的驱动程序,如oracle、postgres和mysql。只是怀疑这是否会奏效,等我回到电脑前再试试。我不知道
访问\u句柄
。但是显式地对所有对象调用
disconnect
将产生与perl销毁程序时隐式断开连接相同的警告,并且您需要对具有打开事务的每个句柄执行
回滚
提交
。@borodin-hmm-true。我回到我的电脑后再编辑
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;
    }
);