如果我将一行中的两个DBI
连接分配给变量,第一个连接会发生什么?感觉不像有一个隐含的disconnect
(没有延迟)。
my $dbh = DBI->connect( $dsn, $user, $pass );
$dbh = DBI->connect( $dsn, $user, $pass );
dbd的析构函数关闭连接。
我的意思是,有可能有一个DBD泄漏数据库连接,但这是极不可能的,这将是一个错误。
可以使用完全相同的参数连接多次。所以我不认为connect
有理由检查是否有任何现有的连接,当然也不要触摸(断开)它。
但是,这个新连接的对象会覆盖Perl变量$dbh
。在这一点上,任何事情都可能发生,因为DBI
使用tie
-ed变量,但我没有在源代码中看到这会触发析构函数(DESTROY
方法),也没有在我查找的驱动程序源代码中看到(mySQL
和Postgresql
)。
所以在我看来,以这种方式,第一个连接上的句柄只是丢失了,并且您有效地得到了泄漏。如果是这种情况,那么在第一个连接中可能打开的事务发生什么情况也是未定义的。
所以我会在连接之前添加对$dbh
的检查,使用(defined
和)state
和/或ping
。然后,如果先前对它的处理确实已经完成,并且您想要覆盖它,那么如果需要,首先关闭它。(另一种选择是构建代码,使新连接进入新声明的变量。)