f Perl DBI 的Error Handling ~ 迪貝之家

Pages

Perl DBI 的Error Handling

 

昨天在處理sql server replication的
re-initialization
就突然發現
怎麼我寫監控程式hang 住了


後來看了whoisactive的資料
原來是訂閱端的agent job作業卡住了
我監控程式的session
其實我的邏輯裡也只是到訂閱端
查看我的表格的資料而已
這個表格是發行項之一
只是agent 的作業裡可能有鎖表
這個動作
才導致我的程式被卡了
我在想.....
如果我的程式都被replication agent
卡住了
那就表示我的警訊也送不出去啊!!
所以應該要加 execution timeout
的處理
因為sql server ODBC driver
預設是沒有timeout
也就是會一直等待下去

查了一下, DBI應該在連線的時候
加上相應的attribute
該怎麼加? ........................

my $dbh = DBI->connect($dsn, $user, $auth,
{ RaiseError => 1,odbc_query_timeout => 3600 });

然後呢 ?? 這程式該怎麼寫呢 ???
嘿......
只好翻書囉~~
因為我之前都只用DBI 的
Automatic error checking
出現問題, 就讓perl死給你看阿

但這個case就不行了
因為exception 要送到作業系統
的事件檢視器

恩.........
翻書阿....
書本才是我在資訊產業的師傅.......
20幾年來,哪來的sea food阿....
倒是吃了不少.......

最後我是用eval 來處理
這也是我第一次寫eval
$dbh->{RaiseError}=0;
eval {
$sth->execute();
};
my $app;
if ( $@ ) {
($app)=Win32::OLE->new("WScript.Shell", sub {$_[0]->Quit;})
 or die "Can't start Shell", Win32::OLE::LastError();
$app->LogEvent(1,"ALERT: XXX.pl timeout due to
being locked by agent long operation!");
}
$dbh->{RaiseError}=1;
反正就是把Automatic
error check關掉
處理完我的邏輯後
再把它打開囉~~

上述的code只是示意
實際上當然不只...
因為看底下的執行畫面就知道囉~~


事件檢視器內訊息