FIX: ADO 2.5 泄漏资源使用 Stream 和记录对象时

文章翻译 文章翻译
文章编号: 282177 - 查看本文应用于的产品
本文已归档。它按“原样”提供,并且不再更新。
展开全部 | 关闭全部

本文内容

症状

当封送处理数据进程中使用 ActiveX 数据对象 (ADO) 记录 或内存泄漏的 Stream 对象,可能会发生的最终会导致内存不足,无法运行该过程。此泄漏与其他 ADO 对象 (如 命令Recordset 对象不会发生。

此泄漏会出现在 Microsoft 数据访问组件 (MDAC) 2.5,但不会发生在 MDAC 2.6。

原因

记录Stream 对象使用活动模板库 (ATL) AtlMarshalPtrInProc 函数来创建用于将代理信息发送回调用方的流。当 记录Stream 对象被销毁时,释放 调用该函数时只需在的流没有第一个调用 AtlFreeMarshalStream 函数以释放内存分配该流的情况下。

解决方案

MDAC

若要解决此问题,获得最新的 service pack,对于 Microsoft MDAC 2.5。有关更多的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
293312信息: 如何获取最新 MDAC 2.5 服务包
此修复程序的英文版应具有以下文件属性或更高版本:
   Date          Version        Size               File name
   ------------------------------------------------------------

   12/14/2000    2.53.6013.0    491,792 bytes      Msado15.dll	
	
				

Windows 2000

若要解决此问题,获得最新的 service pack,对于 Windows 2000。有关更多的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
260910如何获取最新的 Windows 2000 服务软件包
此修复程序的英文版应具有以下文件属性或更高版本:
   Date        Time    Version       Size       File name
   ----------------------------------------------------------
   5/29/2001   02:56p  2.52.6019.1   487,696    Msado15.dll
				

解决方法

没有与 MDAC 2.5 此问题的解决方法。

状态

MDAC

Microsoft 已经确认这是在本文开头列出的 Microsoft 产品中的错误。Microsoft MDAC 2.5 Service Pack 3 中,第一次已得到纠正此问题。

在 MDAC 2.6 中不会发生此问题。

Windows 2000

Microsoft 已经确认这是在本文开头列出的 Microsoft 产品中的问题。Windows 2000 Service Pack 3 中,第一次已得到纠正此问题。

更多信息

此内存泄漏发生在其中 记录Stream 对象的封送的进程,Microsoft Internet 信息服务器 (IIS) 和 Microsoft 事务服务器 (MTS) 的环境中的主要是为了 / COM +。在此封送处理不会发生,如独立的 Microsoft Visual Basic 应用程序的环境中不会发生此泄漏。

重现行为的步骤

  1. 将下面的示例代码粘贴到一个文本文件,并将其保存名为"ADODBMem.vbs"。
  2. 在命令提示符下使用 Windows 脚本宿主 (CScript.exe) 中运行该文件。例如:
    cscript ADODBMem.vbs
  3. 当系统提示,启动性能监视器 (PerfMon),并为可执行 CScript 选择专用字节数计数器。
  4. 返回在的脚本并逐句通过 ADO 对象的创建,如所示。请注意 PerfMon 显示的不断增加的 记录Stream 对象分配内存量。

示例代码

'//////////////////////////////////////////////////////////////////////////////////////////////// 
' +
'   File:       adodbmem.vbs
'
'   Copyright:  (c) 2000 Microsoft Corporation
'
'   Contents:   Creates/destroys ADODB objects and allows to see memory usage (leaks).
'
'   Comments:   CScript.exe v2.0 required (comes with Windows 2000; just copy to run under NT4)
'               WScript.exe will NOT work
'
'               Usage: cscript adodbmem.vbs
'               Use PerfMon to see the counter "Private Bytes" in process "cscript"
' -
'//////////////////////////////////////////////////////////////////////////////////////////////// 

Const REPT_CNT = 1000

Private Function CreateOnce(objName, bStop)
  Dim obj
  On Error Resume Next
  If bStop = True Then
    WScript.StdOut.Write  "Create an instance of " & objName & ">"
    WScript.StdIn.ReadLine
  End If
  Set obj = CreateObject(objName)
  If Err.Number <> 0 Then
    WScript.Echo "CreateObject(" & objName &") failed: " & Err.Description
    CreateOnce = False
    Exit Function
  End If
  If bStop = True Then
    WScript.StdOut.Write objName & " created. Destroy>"
    WScript.StdIn.ReadLine
  End If
  Set obj = Nothing
  If bStop = True Then
    WScript.Echo objName & " destroyed."
  End If
  CreateOnce = True
End Function

'//////////////////////////////////////////////////////////////////////////////////////////////// 

Private Sub TryObject(objName)
  Dim i
  WScript.StdOut.Write "Create and destroy " & objName & " " & REPT_CNT & " times>"
  WScript.StdIn.ReadLine
  For i = 1 To REPT_CNT
    If Not CreateOnce(objName, False) Then Exit For
  Next
  WScript.StdOut.Write "Done. "
End Sub

'//////////////////////////////////////////////////////////////////////////////////////////////// 

Private Sub ShowVersion
  Dim sVer
  Dim o
  Set o = CreateObject("ADODB.Connection")
  sVer = o.Version
  Set o = Nothing
  WScript.StdOut.Write "ADODB version " & sVer & " loaded. Hit Enter to start>"
  WScript.StdIn.ReadLine
End Sub

'//////////////////////////////////////////////////////////////////////////////////////////////// 

Public sub Main()
  WScript.StdOut.Write "ADODB memory leak test." & vbNewLine & _
                "Connect Perfmon: process - cscript, counters - Private Bytes." & vbNewLine & _
                "Hit Enter then ready>"
  WScript.StdIn.ReadLine
  ShowVersion

  TryObject "ADODB.Command"
  TryObject "ADODB.Stream"
  TryObject "ADODB.Recordset"
  TryObject "ADODB.Record"

  WScript.StdOut.Write "All Done. Hit Enter to exit>"
  WScript.StdIn.ReadLine
End sub

Call Main()
Wscript.Quit 0

'//////////////////////////////////////////////////////////////////////////////////////////////// 
'                                  End of file "adodbmem.vbs"
'//////////////////////////////////////////////////////////////////////////////////////////////// 

				

属性

文章编号: 282177 - 最后修改: 2014年2月24日 - 修订: 3.2
这篇文章中的信息适用于:
  • Microsoft Data Access Components 2.5 Service Pack 1
  • Microsoft Data Access Components 2.5
关键字:?
kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbmdac250sp3fix kbado260fix kbbug kbfix kbmdac260fix kbwin2000sp3fix KB282177 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 282177
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