修正: 重複的載入和卸載 Mtxdm.dll 原因 1 MB 的虛擬記憶體遺漏的

文章翻譯 文章翻譯
文章編號: 232351
全部展開 | 全部摺疊

在此頁中

徵狀

當載入與卸載 Mtxdm.dll 迴圈內,以迴圈的每個反覆項目是看不見虛擬記憶體中的一個 1 MB 溢位。

這是最有可能發生在使用 ODBC 連接共用及重複的連接和中斷連線從後端資料庫中建立應用程式或 ODBC 應用程式,讓許多連線及中斷連線到 Oracle 後端。

發生的原因

在 [虛擬記憶體遺漏都是由呼叫 TerminateThread() Mtxdm.dll 中所造成。

連接共用 ODBC 應用程式中使用,來管理連接集區,由背景工作執行緒內 Mtxdm.dll 啟動時,都會載入分配程式管理員 (Mtxdm.dll)。

當應用程式結束時,背景工作執行緒遭呼叫 TerminateThread(),它不會清除,釋出 1 MB 的記憶體配置給背景工作執行緒的堆疊。

同樣的行為可以看到重複的連接和中斷連線到 Oracle 資料庫伺服器,在進行時,因為 Microsoft Oracle ODBC 驅動程式載入 Mtxdm.dll 是否連線集區正在使用或不。

解決方案

若要解決這個問題,請取得最新的 service pack,Windows NT 4.0 或個別的軟體更新。如需取得最新的 service pack 的詳細資訊,請前往:
如需取得個別的軟體更新的詳細資訊,請連絡 Microsoft 產品支援服務。如需 Microsoft 產品支援服務電話號碼以及支援費用的相關資訊的完整清單,請移至下面全球資訊網上:
http://support.microsoft.com/default.aspx?scid=fhEN-US。CNTACTMS (英文)

Windows NT 伺服器或工作站 4.0

若要解決這個問題,請取得最新的 service pack,Windows NT 4.0 或個別的軟體更新。如需取得最新的 service pack 的詳細資訊,請前往:
  • Windows 服務套件中心-或者-

  • 152734如何取得最新的 windows nt 4.0 service pack
如需取得個別的軟體更新的詳細資訊,請連絡 Microsoft 產品支援服務。如需 Microsoft 產品支援服務電話號碼以及支援費用的相關資訊的完整清單,請移至下面全球資訊網上:
http://support.microsoft.com/default.aspx?scid=fhEN-US。CNTACTMS (英文)

Windows NT 伺服器 4.0、 終端機伺服器版本

若要解決這個問題,請取得最新的 service pack,若是 Windows NT 伺服器 4.0,終端機伺服器版本。如需詳細資訊,請按一下下面的文章編號,檢視中的文件Microsoft 知識庫 」:
152734 如何取得最新的 Windows NT 4.0 Service Pack

狀況說明

Microsoft 已確認這是在本篇文章開頭所列的 Microsoft 產品中的問題。 第一次,這個問題已經獲得修正 Windows NT Server 4.0,終端機伺服器版本的服務套件 6 版中。

詳細資訊

手動安裝 Hotfix 051099a

注意: 若要取得此 hotfix,必須連絡 Microsoft 產品支援服務。請參閱這篇文章,如需詳細資訊的解決方案一節。
  1. 關閉或停止的任何應用程式或服務所使用的 Mtxdm.dll。這可能包括網際網路資訊服務 (IIS) 」、 「 Microsoft 交易伺服器 (MTS) 」、 「 Microsoft 分散式交易協調器 (DTC) 及 「 任何 ADO 或 ODBC 應用程式。
  2. 下載 hotfix (051099a.exe) 到暫時目錄並執行以解壓縮下列檔案:
    • Mmtxdm.dll
    • Readme.txt
  3. 找出並重新命名目前版本的 Mtxdm.dll,應該要記為 Windows 9x 電腦和 Windows NT 電腦的 [\Winnt\System32] 資料夾中。
  4. 將 Mtxdm.dll 的 hotfix 版本複製到相同的位置,然後重新啟動您的服務及應用程式。

若要重現問題的步驟

建立使用下列程式碼的 C/c + + 主控台應用程式。執行這個應用程式時使用效能監視器 」 來檢視應用程式的虛擬位元組。

注意: 這個程式碼範例會使用 ODBC 資料來源連線到 Oracle 後端,因為 Microsoft Oracle ODBC 驅動程式載入 Mtxdm.dll,並更輕鬆地將說明的問題。
   #include        <windows.h>
   #include        <stdio.h>
   #include        <sql.h>
   #include        <sqlext.h>
   #include        <assert.h>

   #define CK_RT(x) if( x != SQL_SUCCESS && x != SQL_SUCCESS_WITH_INFO)    assert(0)

   void main(){
       HENV        henv;
       HDBC        hdbc;
       RETCODE     rc = SQL_SUCCESS;
       char        *dsnStr="DSN=OracleServer;UID=scott;pwd=tiger;";
       short       rtnLen = 0;
       UCHAR       rtnDSN[999] = "";
       int         i,x;


       for (i=0; i < 100; i++)
   	{
               rc = SQLAllocEnv(&henv);
               CK_RT(rc);
               rc = SQLAllocConnect(henv, &hdbc);
               CK_RT(rc);
               rc = SQLDriverConnect(hdbc,
                         NULL,
                         (unsigned char *)dsnStr,
                         strlen(dsnStr),
                         rtnDSN,
                         255,
                         &rtnLen,
                         SQL_DRIVER_NOPROMPT);

               CK_RT(rc);
               SQLDisconnect(hdbc);
               SQLFreeConnect(hdbc);
               SQLFreeEnv(henv);
	   }
   }
				

屬性

文章編號: 232351 - 上次校閱: 2012年6月13日 - 版次: 3.0
關鍵字:?
kbqfe kbhotfixserver kbbug kbfix kbmdac210fix kbmts200fix kbsdkodbc351fix kbvirtualmem kbmt KB232351 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:232351
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com