连续为变量赋值两个DBI连接时,第一个连接会如何变化?
连续赋值两个DBI连接时第一个连接的行为
当你执行这段Perl代码时:
my $dbh = DBI->connect( $dsn, $user, $pass ); $dbh = DBI->connect( $dsn, $user, $pass );
第一个DBI连接句柄($dbh最初指向的对象)会失去所有引用,此时Perl的垃圾回收机制会在某个不确定的时间点自动销毁这个对象,而DBI的默认行为是在对象被销毁时自动调用disconnect方法关闭连接。
需要明确几个关键点:
- 这个自动
disconnect不是即时发生的,Perl的垃圾回收是延迟触发的,所以你不会立刻看到连接被关闭,这就是你觉得“没有隐式disconnect操作(没有延迟)”的原因——不是没执行,而是执行时机不确定。 - 如果程序很快退出,垃圾回收大概率会在程序结束前触发,连接会被正常关闭;但如果程序长时间运行,第一个连接可能会在内存中存在一段时间才被回收,对应的数据库连接也会保持一段时间。
- 若要确保第一个连接立刻关闭,建议显式调用
disconnect后再重新赋值:my $dbh = DBI->connect( $dsn, $user, $pass ); $dbh->disconnect(); # 显式关闭第一个连接 $dbh = DBI->connect( $dsn, $user, $pass );
内容的提问来源于stack exchange,提问作者sid_com
相关产品推荐
相关产品推荐

