最近客戶反應,系統會出現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後 會自動斷開連接的。 ---------------------------------------------- - |
作者: |
|
2007-7-23 7:43:58 | ||||
8樓: | TADOConnection.KeepConnection 屬性是True呀, 謝謝您的關注! ---------------------------------------------- - |
作者: |
|
2007-7-23 14:16:25 | ||||
9樓: | 那再檢查數據集的 CursorType, 當屬性爲ctOpenForwardOnly、並且ReadOnly情況下性能最佳,執行速度最快。CursorType=ctKeyset 的時候性能最差. ---------------------------------------------- - |
作者: |
|
2007-7-23 15:43:44 | ||||
10樓: | CursorType是用的默認值ctKeyset,以前還真沒注意這個屬性值的區別,現已改成ctOpenForwardOnly,但還是沒解決如上的問題:( ---------------------------------------------- - |
作者: |
|
2007-7-23 23:09:43 | ||||
11樓: | 如果CursorLocation設置的是server-side cursor,對於 ctOpenForwardOnly,如果有 n個 打開的表,服務器將建立n個隱式的connection! 因爲sqlServer一個connection只能有一個打開的ctOpenForwardOnly(default-resultset)Cursor. 當然對於以 ctOpenForwardOnly方式打開的表,操作該表的數據性能是最快的. 如果需要同時打開多個表就改成 ctStatic吧, 或者同一時間只打開一個表. ---------------------------------------------- - |
作者: |
|
2007-7-24 7:23:06 | ||||
12樓: | 同一時間只打開一個表是不可能的了,因爲查詢時得JOIN參數表,改成ctStatic了。 呃,,,但是上面的問題還是沒解決 :( 謝謝您一直關注!! ---------------------------------------------- - |
作者: |
|
2007-7-24 11:07:32 | ||||
13樓: | 不客氣,你是用多個簡單表(無觸發器,無Join)測試的?簡單表下還是每次會話都會有 Audit login/logout? 你的connection string是什麼? ---------------------------------------------- |
-- Provider=SQLOLEDB;Password=密碼;User ID=用戶;Initial Catalog=數據庫;Data Source=數據庫服務器IP地址;
----------------------------------------------
-
作者: |
|
2007-7-25 19:13:09 | ||||
18樓: | 這裏有一篇各種連接字符串和數據打開方式的性能測試,可以參考: http://www.motobit.com/tips/detpg_Perfdata/ |
忘記問了,既然是SUM 那麼ADOQuery的 LockType 屬性是否設置的是 ltReadOnly?? ---------------------------------------------- - |
作者: |
|
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還是出現了?? ---------------------------------------------- |