Perl 如何断开与所有数据库连接字符串的连接
我有一个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),
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;
}
);