連線資料庫時發生"一般性網路錯誤"的另類解釋
revision history:
version
date
creator
description
1.0.0.1
2003-11-15
鄭昀草稿
implementation scope:
本文件將說明出現一種不容易想到原因的訪問資料庫時發生「一般性網路錯誤」,錯誤報告的**是adodb,錯誤號是「-2147467259,或者0x80004005」。
n microsoft sql server 2000
n microsoft ado
sql server、ado、dbmssocn、0x80004005
現象一天,突然有這麼乙個問題擺在面前:
使用者瀏覽工作流系統時,突然跑出來這麼乙個錯誤:
microsoft vbscript 編譯器錯誤 錯誤 '800a03f6'
缺少 'end'
/iishelp/common/500-100.asp,行242
microsoft ole db provider for sql server 錯誤 '80004005'
[dbmssocn]一般性網路錯誤。請檢查網路文件。
/***/yyyframe.asp,行23
經過排查,確定真正的原因在於呼叫ado連線sql server 2000時,發生異常,錯誤描述就是「[dbmssocn]一般性網路錯誤。請檢查網路文件。」,至於那個「microsoft ole db provider for sql server 錯誤 '80004005'」其實並沒有太多意義。
為什麼會突然出現「[dbmssocn]一般性網路錯誤。」呢?
伺服器頁面呼叫的是封裝好的com+ sta 元件,連線sql server 2000的其實是這個元件。
後來又提供乙個比較重要的資訊,當這些事情發生的時候,注意到com+應用的程序占用了200mb的記憶體。
初步的猜想
以前曾經在其他地方遇到過這種錯誤。
但是,那是因為網絡卡或者網線閃斷(「network is down」),造成連線資料庫失敗,服務又不停地試著去連線。不知道在什麼情況下,服務不斷報告:
錯誤環境說明:執行sql命令從資料庫讀取記錄時發生com異常;
錯誤說明:[dbmssocn]一般性網路錯誤。請檢查網路文件。
錯誤號:-2147467259
「[dbmssocn]」指的是,當前用tcp/ip協議與資料庫通訊。
但是,這次環境的網路質量沒有問題。
模擬試驗
專家指出可能是因為同一臺伺服器和sql server之間的連線都沒有close,所以導致連線達到被允許的最大數目,從而被全部關閉。
於是我們試驗,看看一台伺服器被允許與sql server建立最多多少個連線。
更多資訊
測試程式中重用了原工程中initadocmd (_command** ppicmd)方法。
這個方法利用ado.command::put_activeconnection方法來建立資料庫連線的:
varconn = _bstr_t("provider=sqloledb.1;……」);
hr = t_picmd->put_activeconnection(varconn);
在windows xp環境中,迴圈呼叫這個函式到了1980次,程式就出現幾秒鐘的停頓。之後,就得到0x80004005的錯誤返回值。這個值是由put_activeconnection方法返回的,並不是異常。所以看不到ado異常描述。
我們通過測試程式停滯時,立刻用乙個vbs指令碼再次請求建立資料庫連線。於是,vbs指令碼一起停滯,隔了幾秒鐘後,丟擲異常,錯誤描述為:
"[dbnetlib][connectionopen (preloginhandshake()).]一般性網路錯誤。請檢查網路文件。"
之後的1981、1982、...次put_activeconnectio呼叫,都會是同乙個錯誤返回值。
在sql server事件探查器中,看到1980次呼叫之前,都只有audit login事件。除非關閉測試程式,才會唰地一下所有的audit logout事件出來了。
有時候,當第1981次建立連線的請求被sql server 2000認為超出允許範圍時,sql server 2000會主動將這一千多個的連線同時全部中斷。於是乎,在sql server事件探查器中,你也可以看到唰地一下所有的audit logout事件出來了。
如果測試程式維持著這些資料庫連線的話,記憶體會持續增長,如下所示:
在winxp上(win2000上允許連線的數目少),
情況1:
單純反覆執行ado.command::put_activeconnection,則只有「audit login」事件,沒有logout事件。這種請求最多達到1980之後,就會出現「一般性網路錯誤」。
情況2:
如果是反覆執行
ado.command::put_activeconnection方法,然後又執行了查詢,返回記錄集,則這種迴圈最多達到483之後,就會出現「一般性網路錯誤」。
在實際測試中,第1種情況,最開始demo用了6mb記憶體,最後累積的記憶體是:104mb。
第2種情況下,最開始demo用了6mb記憶體,最後累積的記憶體是:39.5mb。
你可以通過下面的sql語句察看當前與sql server保持的連線都來自於**,有多少個:
select dbid,db_name(dbid) as dbname,hostname,status,last_batch
from sysprocesses
where db_name(dbid)='%yourdatabasename%' and (last_batch > 'yy-mm-dd mm:ss:00')
order by last_batch desc
總結:雖然這種情況出現的比較罕見,但是如果排除了網路質量原因,你也許可以注意一下當前伺服器與sql server的connection數目是否維持在乙個正在高漲的數量。
當連線不斷增加的時候,就要當心,伺服器連線資料
GDI 中發生一般性錯誤
替代方法 建立非索引映像。建立索引映像。這兩種情況下,原始 位圖 上呼叫 bitmap.dispose 方法刪除該檔案上鎖或刪除要求,流或記憶體保持活動。建立非索引影象 即使原始映像被索引格式中該方法要求新影象位於每畫素 超過 8 位 非索引畫素格式。此變通方法使用 graphics.drawima...
GDI 中發生一般性錯誤 的解決辦法
bitmap 物件或乙個 影象 物件從乙個檔案,構造時該檔案仍保留鎖定對於物件的生存期。因此,無法更改影象並將其儲存回它產生相同的檔案。建立乙個bitmap型別的bmp變數來讀取檔案。bitmap bmp new bitmap openfiledialog1 filename 新建第二個bitmap...
連線資料庫後的一般操作
連線資料庫後的一般操作 using system using system.collections.generic using system.data using system.data.sqlclient using system.linq using system.text using syst...