gpt4 book ai didi

Perl 死于 : "Usage: DBD::Pg::db::DESTROY(dbh) during global destruction"

转载 作者:行者123 更新时间:2023-11-29 12:05:59 31 4
gpt4 key购买 nike

在生产环境中运行的稳定的、基于网络的、单线程/进程的 perl 应用程序开始间歇性地抛出此错误,并且仅在系统负载较重的情况下。我们无法确定根本原因。

Usage: DBD::Pg::db::DESTROY(dbh) during global destruction

任何人都可以对此错误提供任何解释吗?当 Perl 在关闭前进行清理时,在没有参数(self?)的情况下调用 DESTROY 时,它似乎是从 Pg.sx 中抛出的。 (我通过谷歌在旧源代码中看到了这条消息,但在我们的版本中没有。)我们的环境:

  • 操作系统:FreeBSD 8.3-STABLE
  • Perl v5.14.2
  • DBD::Pg v2.19.3
  • PostgreSQL: v9.2.3

最佳答案

这是黑暗中的一张照片。

DBI 数据库句柄通常像任何其他对象一样被销毁 - 当没有引用它们时。但是,事情可以防止句柄被自然破坏:

  • 句柄是全局包
  • 句柄构成 Perl 无法自动释放的循环引用的一部分

发生这种情况时,该对象作为“全局销毁”的一部分被销毁,这基本上只是取消所有内容的定义并实际上以随机顺序调用 DESTROY。这可能是导致您出现虚假错误的原因。

首先,您可以尝试在脚本的开头和结尾枚举您的数据库句柄,看看最后是否还有任何句柄在使用中。参见 this code snippet :

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);

如果您不确定为什么该对象仍在使用中,您可以使用 Devel::Cycle在一些大数据结构上找到它们。

您还可以找到 DBI 的 tracing functionality有用。在运行脚本之前导出 DBI_TRACE=2,每次创建或销毁句柄时它都会记录下来。

关于Perl 死于 : "Usage: DBD::Pg::db::DESTROY(dbh) during global destruction",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15030230/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com