Audit Login 導致死機的原因

最近客戶反應,系統會出現3-5分鐘的集體死機情況,用sqlserver跟蹤分析器查看,發現一個login out 佔用了十幾分鐘的系統時間。目前還沒找到問題的根源,在網上收到一些描述:

在網上找到臨時解決方案,在數據庫連接串中添加以下內容即可緩解:
Enlist=true;Pooling=true;Max Pool Size=300;Min Pool Size=0;Connection Lifetime=300;packet size=1000

SQL事件探查器中,偶爾出現的audit logout,執行時間更長,要幾十秒,有時甚至要幾分鐘。

是不是這樣?

確定真正的原因在於調用ADO連接SQL Server 2000時,發生異常,錯誤描述就是“[DBMSSOCN]一般性網絡錯誤。請檢查網絡文檔?
爲什麼會突然出現“[DBMSSOCN]一般性網絡錯誤。”呢?

但是,那是因爲網卡或者網線閃斷(“network is down”),造成連接數據庫失敗,服務又不停地試着去連接。不知道在什麼情況下,服務不斷報告:

可能是因爲同一臺服務器和SQL Server之間的連接都沒有Close,所以導致連接達到被允許的最大數目,從而

你可以通過SQL語句察看當前與SQL Server保持的連接都來自於哪裏,有多少個:
這個方法利用ADO.Command:ut_ActiveConnection方法來建立數據庫連接的:

有時候,當第N+1(如:2000個)次建立連接的請求被SQL Server 2000認爲超出允許範圍時,SQL Server 2000會主動將這一千多個的連接同時全部中斷。於是乎,在SQL Server事件探查器中,你也可以看到唰地一下所有的Audit Logout事件出來了。

如果測試程序維持着這些數據庫連接的話,內存會持續增長

這個有沒有問題?

雖然這種情況出現的比較罕見,但是如果排除了網絡質量原因,你也許可以注意一下當前服務器與SQL Server的connection數目是否維持在一個正在高漲的數量。

當連接不斷增加的時候,就要當心,服務器連接數據庫是有一定限制的,而且達到最大值後,其他程序再次請求連接時,就可能得到“一般性網絡錯誤”的警告,而且錯誤號80004005也並沒有說明到底發生了什麼,SQL Server和ADO並不會告訴你連接數已經達到最大值

我認爲是ADO版本問題,安裝正確版本。

你可以通過下面的SQL語句察看當前與SQL Server保持的連接都來自於哪裏,有多少個:

你有沒有查一查.
如果連接過多.就會自動Audit Logout
於是乎,在SQL Server事件探查器中,你也可以看到唰地一下所有的Audit Logout事件出來了。
這些都會佔用內存的呀.

你試驗,看看一臺服務器被允許與SQL Server建立最多多少個連接。

總之.你先看一看.是不是連接達到一個數字後.全部CLOSE 但還在跟蹤從而佔用內存.

 解決:

 

如果執行 Audit Logout 說明是ADO連接被斷開。

檢查 TADOConnection.KeepConnection 屬性,如果設置是False,那麼當關閉DataSet後
會自動斷開連接的。
----------------------------------------------
-
作者:
女w_si (w_si) ▲△△△△ -
普通會員
2007-7-23 7:43:58
8樓: TADOConnection.KeepConnection 屬性是True呀,
謝謝您的關注!
----------------------------------------------
-
作者:
男lmaomi (tiger) ▲△△△△ -
普通會員
2007-7-23 14:16:25
9樓: 那再檢查數據集的 CursorType, 當屬性爲ctOpenForwardOnly、並且ReadOnly情況下性能最佳,執行速度最快。CursorType=ctKeyset 的時候性能最差.
----------------------------------------------
-
作者:
女w_si (w_si) ▲△△△△ -
普通會員
2007-7-23 15:43:44
10樓: CursorType是用的默認值ctKeyset,以前還真沒注意這個屬性值的區別,現已改成ctOpenForwardOnly,但還是沒解決如上的問題:(
----------------------------------------------
-
作者:
男lmaomi (tiger) ▲△△△△ -
普通會員
2007-7-23 23:09:43
11樓: 如果CursorLocation設置的是server-side cursor,對於 ctOpenForwardOnly,如果有 n個 打開的表,服務器將建立n個隱式的connection! 因爲sqlServer一個connection只能有一個打開的ctOpenForwardOnly(default-resultset)Cursor.

當然對於以 ctOpenForwardOnly方式打開的表,操作該表的數據性能是最快的.

如果需要同時打開多個表就改成 ctStatic吧, 或者同一時間只打開一個表.
----------------------------------------------
-
作者:
女w_si (w_si) ▲△△△△ -
普通會員
2007-7-24 7:23:06
12樓: 同一時間只打開一個表是不可能的了,因爲查詢時得JOIN參數表,改成ctStatic了。
呃,,,但是上面的問題還是沒解決 :(

謝謝您一直關注!!
----------------------------------------------
-
作者:
男lmaomi (tiger) ▲△△△△ -
普通會員
2007-7-24 11:07:32
13樓: 不客氣,你是用多個簡單表(無觸發器,無Join)測試的?簡單表下還是每次會話都會有 Audit login/logout? 你的connection string是什麼?
----------------------------------------------
去掉Use Procedure 試下,另外 SQLOLEDB 後面不要加版本號,這樣會強制使用版本1,而不能用新版本:
-- Provider=SQLOLEDB;Password=密碼;User ID=用戶;Initial Catalog=數據庫;Data Source=數據庫服務器IP地址;
----------------------------------------------
-
作者:
男lmaomi (tiger) ▲△△△△ -
普通會員
2007-7-25 19:13:09
18樓: 這裏有一篇各種連接字符串和數據打開方式的性能測試,可以參考:

http://www.motobit.com/tips/detpg_Perfdata/
忘記問了,既然是SUM 那麼ADOQuery的 LockType 屬性是否設置的是 ltReadOnly??
----------------------------------------------
-
作者:
女w_si (w_si) ▲△△△△ -
普通會員
2007-7-28 16:31:00
21樓: lmaomi:
讓您問着了,屬性還是默認的ltOptimistic,改成ltReadOnly後,不出現Audit Logout和Audit Login。
(adLockReadonly:默認值,只讀。無法更改數據。(這是RecodSet的默認值,如果你把鎖定的方式設爲該值,那麼你將不能更新 Recordset。)),用ltOptimistic屬性怎麼會有這種差別呢?
但SET NO_BROWSETABLE ON與SET NO_BROWSETABLE OFF還是出現了??
----------------------------------------------
發佈了43 篇原創文章 · 獲贊 7 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章