Perl 为DBD::Pg数据库连接设置超时

Perl 为DBD::Pg数据库连接设置超时,perl,postgresql,timeout,dbi,Perl,Postgresql,Timeout,Dbi,我已经在Perl代码中尝试过这一点,但是timeout不起作用: my $dbh = DBI->connect($db, $db_user, $db_pass,{ timeout => 5 }); 我想在连接到postgresql数据库时设置超时:我该怎么做?也许您可以使用alarm local $SIG{ALRM} = sub { print "timeout occurred\n" }; # NB: \n required alarm $timeout; # set you

我已经在Perl代码中尝试过这一点,但是
timeout
不起作用:

 my $dbh = DBI->connect($db, $db_user, $db_pass,{ timeout => 5 });

我想在连接到postgresql数据库时设置超时:我该怎么做?

也许您可以使用alarm

local $SIG{ALRM} = sub { print "timeout occurred\n" }; # NB: \n required 
alarm $timeout; # set your value here 
my $dbh = DBI->connect($db, $db_user, $db_pass);
alarm 0;
有关更多信息,请参见:

稍后编辑:

这似乎有效,请查看是否符合您的需要:

use DBI;

my $timeOut = 5;
$SIG{ALRM} = \&timeout;
$SIG{CHLD} = 'IGNORE',
alarm($timeOut);

my $pid = fork();
if ($pid) { # Parent
   print "Started child process id: $pid\n";
} elsif ($pid == 0) { # Child
  my $dbh = DBI->connect($db, $db_user, $db_pass);
} else { # Unable to fork
   die "ERROR: Could not fork new process: $!\n\n";
}

waitpid ($pid, 0);
alarm(0);

sub timeout {
     print "timeout occured";
     kill 9, $pid;
}
第二次编辑: 报警的主要问题可能是在使用Windows时。
请参见

据我所知,使用构造函数是无法做到这一点的。但是,这可以使用PostgreSQL客户端配置参数来完成-您可以使用配置文件或环境变量来更改连接设置

一般来说,它允许通过使用连接和查询缓存进行大量“透明”超时处理。这种排序方法的一个例子是基于and
DBD::Pg
的模块

在PostgreSQL客户端配置中设置连接超时 NB:调用构造函数时,还可以使用环境变量或
服务
参数(请参阅)将连接句柄引用到。使用
service
参数或
$PGSERVICE
可以调整该配置文件中的超时值。
pg_service.conf
文件是一个系统范围或用户特定的文件,可以为特定的PostgreSQL“服务”设置值

例如,您可以设置值。后一种方法适用于链接到
libpq
的任何客户端库。我不确定
DBD::Pg
如何使用那里设置的值,或者它们是否可以被
DBI
应用程序使用。也不清楚这是你想要的

您可以尝试查看现有
DBD::Pg
perl应用程序的任何可用代码,以了解其他开发人员如何处理超时和数据库连接。Django、PHP和其他可能使用
libpq
连接到PostgreSQL的语言能够直接使用环境变量。在shell中或通过
$ENV{PGCONNECT\u TIMEOUT}
设置此选项也适用于您的情况


应用程序中的“超时” 如果要控制应用程序在数据库不可用时如何尝试重新建立与数据库的连接,或者如果数据库服务器没有响应,则要停止尝试连接(例如在启动时),请设置
{RaiseError=>1}
,并使用
eval
报警
(请参阅)按照建议,检查应用程序内部的错误是标准方法,至少在UNIX平台上是这样

对于简单的启动超时,您可以执行以下操作:

use DBI;

sub dbh_connect { 
  my $dbh = DBI->connect("dbi:Pg:dbname=test", '', '',); 
}

my $timeout = 5;
my $time    = time + $timeout;
while ( ! dbh_connect() ) { 
   say "connecting"; 
   sleep 1;
   if ( time >= $time ) { 
     die "unable to connect after $timeout seconds" ;  
   } 
}
避免深入研究信号。在应用程序运行时,您可以使用最小的测试查询手动检查连接:

if ( ! $dbh->ping ) { print "Unable to connect to database\n" } ;

如果要定期检查连接是否正常工作,则和函数都很有用

timeout
属性是否记录在任何地方,或者您只是猜测并希望它能工作?我想,不要给出任何错误,但不要工作:(通过环境变量设置值是否达到您想要的效果?请参阅下面的我的回答和-postgreSQL客户端库(
libpq
)有几种方法可以调整配置设置,但这些设置可能并不总是在应用程序语言绑定中公开。哪种方法不起作用?不起作用不足以调试问题:)我将超时设置为5秒,但没有在5秒时超时:(请让我了解:您希望有一个存在5秒钟的连接,然后您希望关闭该连接?因为我没有得到“未超时”。如果连接成功,您将不会有超时。您可以,请更明确地说明您想要实现的目标吗?请参阅我稍后的编辑,我已经尝试过,并且似乎有效,请查看您是否可以将此想法与您需要的整合。@G.Cito:出现警报()Windows上存在一些问题:。我认为您的答案是正确的,确保超时的最佳方法是从postgres配置,当您不是数据库管理员并且需要“在应用程序中”超时时,可能会出现问题。