連線資料庫時發生 一般性網路錯誤 的另類解釋

2021-05-24 07:40:55 字數 3009 閱讀 6100

連線資料庫時發生"一般性網路錯誤"的另類解釋

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...