如果我在一行中分配两个DBI连接给变量会发生什么?



如果我将一行中的两个DBI连接分配给变量,第一个连接会发生什么?感觉不像有一个隐含的disconnect(没有延迟)。

my $dbh = DBI->connect( $dsn, $user, $pass );
$dbh = DBI->connect( $dsn, $user, $pass );

dbd的析构函数关闭连接。

我的意思是,有可能有一个DBD泄漏数据库连接,但这是极不可能的,这将是一个错误。

可以使用完全相同的参数连接多次。所以我不认为connect有理由检查是否有任何现有的连接,当然也不要触摸(断开)它。

但是,这个新连接的对象会覆盖Perl变量$dbh。在这一点上,任何事情都可能发生,因为DBI使用tie-ed变量,但我没有在源代码中看到这会触发析构函数(DESTROY方法),也没有在我查找的驱动程序源代码中看到(mySQLPostgresql)。

所以在我看来,以这种方式,第一个连接上的句柄只是丢失了,并且您有效地得到了泄漏。如果是这种情况,那么在第一个连接中可能打开的事务发生什么情况也是未定义的。

所以我会在连接之前添加对$dbh的检查,使用(defined和)state和/或ping。然后,如果先前对它的处理确实已经完成,并且您想要覆盖它,那么如果需要,首先关闭它。(另一种选择是构建代码,使新连接进入新声明的变量。)

最新更新