簡體   English   中英

Perl DBI 連接和執行超時

[英]Perl DBI connect and execute timeout

在工作中,我們有一位 DBA,他說他的 RAC 工作得很好,但事實並非如此。 像 Toad 或 SQL Developer 這樣的 SQL IDE 會隨機丟棄它們的連接(我懷疑是因為 RAC 的網絡設置不正確)。 我想通過測試來證明我的理論。 我猜一個 perl 腳本可以解決這個問題:

步驟 1. ping 數據庫的 IP

步驟 2. 如果 IP 已啟動,則嘗試連接到數據庫

步驟 3. 如果已連接,請從雙連接和關閉連接中選擇 sysdate

步驟 4. 等待一段時間並重新開始

我已經設法使用 DBI 在 Perl 中編寫了這個,但我不知道如何使連接和查詢執行超時。 是否有一些解決方案可以讓這些事情超時?

您可以使用與 DBI 相關的信號來實現使用alarm()$SIG{ALRM}的超時。

來自 cpan 和cpan pod上的DBI模塊

超時

實現超時的傳統方法是設置 $SIG{ALRM} 來引用一些在 ALRM 信號到達時將執行的代碼,然后調用 alarm($seconds) 來調度要傳遞的 ALRM 信號 $seconds未來。

例如:

my $dbh = DBI->connect("DBI:SQLRelay:host=$hostname;port=$port;socket=", $user, $password) 要么死 DBI->errstr;

我的 $sth = $dbh->prepare($query) 或者死 $dbh->errstr;

 eval { local $SIG{ALRM} = sub { die "TIMEOUT\\n" }; # \\n is required eval { alarm($seconds); if(! $sth->execute() ) { # execute query print "Error executing query!\\n" } }; # outer eval catches alarm that might fire JUST before this alarm(0) alarm(0); # cancel alarm (if code ran fast) die "$@" if $@; }; if ( $@ eq "TIMEOUT\\n" ) { ... } elsif ($@) { ... } # some other error

第一個(外部) eval 用於避免“執行代碼”死亡和警報在取消之前觸發的不太可能但可能的機會。 如果沒有外部 eval,如果發生這種情況,如果您沒有 ALRM 處理程序或將調用非本地警報處理程序,您的程序就會死掉。

這似乎取決於您連接到哪個數據庫后端。 例如, DBD::mysql確實記錄了這樣的超時值:

mysql_connect_timeout

 If your DSN contains the option "mysql_connect_timeout=##", the connect request to the server will timeout if it has not been

在給定的秒數后成功。

但是,我沒有看到為 Oracle 記錄的相同內容。

我確實在 DBI 文檔中找到了關於使用信號處理執行此操作的討論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM