一个稳定的、基于web的、单线程/进程、在生产中运行的perl应用程序开始断断续续地抛出这个错误,而且只在沉重的系统负载下。我们无法确定根本原因。
Usage: DBD::Pg::db::DESTROY(dbh) during global destruction有人能解释一下这个错误吗?它似乎是从Pg.sx抛出时,销毁被调用时,没有一个参数(自我?)当Perl在关闭之前进行清理时。(我通过google在较旧的源代码中看到了这条信息,但在我们的版本中却没有。)我们的环境:
发布于 2013-02-22 22:12:52
这是一张黑暗中的照片。
DBI数据库句柄通常与任何其他对象一样被销毁--当没有引用它们时。然而,东西可以防止手柄自然地被破坏:
当这种情况发生时,这个对象就会作为“全球毁灭”的一部分被摧毁,这基本上就是解除所有的防御,并以一个随机的顺序调用DESTROY。这可能是导致你的虚假错误的原因。
首先,您可以尝试在脚本开始和结束时枚举DB句柄,并查看是否有任何句柄在结束时仍在使用。请参阅这个代码片段
sub show_child_handles {
my ($h, $level) = @_;
printf "%sh %s %s\n", $h->{Type}, "\t" x $level, $h;
show_child_handles($_, $level + 1)
for (grep { defined } @{$h->{ChildHandles}});
}
my %drivers = DBI->installed_drivers();
show_child_handles($_, 0) for (values %drivers);如果您不确定对象为什么还在使用,可以在一些大数据结构上使用发展::周期来查找它们。
您可能还会发现DBI的跟踪功能很有用。在运行脚本之前导出DBI_TRACE=2,每次创建或销毁句柄时,它都会记录下来。
发布于 2015-03-11 08:26:53
在我的例子中,它是在升级服务器之后开始发生的,因此它似乎是PostgreSql/Perl/DBD版本特定的错误。
这个错误突然开始在所有脚本中抛出,在这些脚本中,我无法解释地销毁数据库句柄。添加$dbx->disconnect()解决了这个问题。
更新:这个解决方法只修复了我的一些脚本中的错误。在另一些情况下,当明确地销毁数据库句柄时,错误也会持续存在。
https://stackoverflow.com/questions/15030230
复制相似问题