昨天在處理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只是示意 |
實際上當然不只... |
因為看底下的執行畫面就知道囉~~ |
事件檢視器內訊息 |
---|