我觉得我的 SQL 连接一定有问题。我通常忽略了它,但我最终会尝试深入了解它。
my $dsn = "DBI:Oracle:host=$host;sid=$sid";
my $dbh = DBI->connect($dsn,$dbuser,$dbpass,{ RaiseError => 1,AutoCommit => 0 }) or die("Unable to connect: $DBI::errstr");
我每次跑步都需要 60 秒DBI->connect
。相当大的查询可能需要一些时间,网络延迟可能会导致一些延迟,但所有这些都在连接所需的 60 秒之上。我可以DBI->connect
在不实际运行查询的情况下运行然后立即关闭它,这将需要 60 秒。我可以使用不同的工具毫无问题地查询这个数据库,但是任何时候我DBI->connect
对它运行,都需要 60 秒。我的大多数查询都以 61.2 秒、63.4 秒或 65.3 秒的时间返回。无论如何,从脚本点击 DBI->connect 到它点击下一行的时间是 60 秒。我什至在前一行和后一行都加盖了时间戳。时间戳之间的唯一内容是DBI->connect
.
我究竟做错了什么?
感谢@ThisSuitIsBlackNot 将我指向DBI 中的跟踪功能,我能够在未指定端口的情况下将其追踪到错误。我知道在其他程序中设置其他连接时我应该指向1521,但是DBI不需要端口来工作,它只是等待它给出结果的60秒。除非另有说明,否则 DBI 首先假定 1526 是目标端口,因此当针对在 1521 上运行的服务器时,它会在 60 秒后超时,然后再尝试 1521。
原来的:
DBI -> 端口 1526 -> 无响应 -> 等待 60s -> 无响应 -> 失败 -> 端口 1521 -> 成功
指定端口:
DBI -> 端口 1521 -> 成功
在不了解您的设置的情况下,我不能肯定地说。但是,您可以快速检查的一件事是 $host 的 DNS 解析。
在 perl 和 oracle 之外,尝试从同一台机器上对数据库主机进行 DNS 查找,看看需要多长时间。