使用 ADO 中的参数化的命令的 FIX: 连接泄漏

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

本文内容

症状

使用 Windows 基础类的 Java (WFC) 和 ADO,并打开记录集使用参数化的命令对象的已正确关闭连接是不能正确地汇集在一起,回收时, 导致泄漏的连接。 要变通解决此问题,请后关闭 ADO 连接 Java COM 对象中的调用 System.gc()。在正常的情况下不需要调用 System.gc() 以便释放连接在关闭 ADO 连接之后。

解决方案

最新的服务包,Windows 2000 和 MDAC 2.5 中解决此问题。
  • 若要解决此问题,获得最新的 service pack,对于 Windows 2000。有关更多的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    260910如何获取最新的 Windows 2000 服务软件包
  • 若要解决此问题,获得最新的 service pack,对于 Microsoft 数据访问组件 2.5。有关更多的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
    293312信息: 如何获取最新 MDAC 2.5 服务包
此修复程序的英文版应具有以下文件属性或更高版本:
File name       Date        Size      Version      
-----------------------------------------------------
Msado15.dll     1/26/2000   329KB     2.12.4926.0
				

状态

Microsoft 已经确认这是 Microsoft 数据访问 Objects2.1 SP2 和 2.5 中的问题。Microsoft 数据访问组件 2.5 Service Pack 2 和 Microsoft Windows 2000 Service Pack 2 中,第一次已得到纠正此问题。

更多信息

当所有下列条件都存在时,就会出现此连接/会话池问题:
  1. 安装 Microsoft 数据访问对象 2.1 SP2。
  2. 使用参数化的 ADO Command 对象。
  3. Java COM 对象被驻留在 MTS 或 COM +。
  4. Java COM 对象创建未连接记录集。

重现行为的步骤

  1. 创建名为 ConnLoss Visual J + + 6.0 使用下面的代码与 Java COM 对象项目:
    import com.ms.wfc.data.*;
    
    public class ConnLoss
    {
      // Modify this connection string to point to a running SQL Server.
      private static String m_connect = 
        "Provider=SQLOLEDB;Server=(Local);Database=Pubs;UID=sa;PWD=;";
      public com.ms.wfc.data.adodb._Recordset 
        FindAuthorsLastName( String au_id, boolean fCallGC )
      {
        Connection conn = null;
        Command cmd   = null;
        Recordset rs  = null;
        try
        {     
          // Open connection to SQL Server.
          conn = new Connection();
          conn.setCursorLocation( AdoEnums.CursorLocation.CLIENT );
          conn.open( m_connect );
          
          // Prepare command object.
          cmd = new Command();
          cmd.setActiveConnection( conn );
          
          cmd.setCommandText( "select au_lname from authors where au_id=?" );
        
          cmd.getParameters().append( 
            cmd.createParameter( "au_id", 
                       AdoEnums.DataType.VARCHAR,
                       AdoEnums.ParameterDirection.INPUT,
                       20, au_id ) );
          
          // Execute command.
          rs = cmd.execute();
          
          // Disconnect recordset and close connection.
          rs.setActiveConnection( (Connection) null );
          conn.close();
          
          // Call gc if requested.
          if (fCallGC) System.gc();
          
          // Return disconnected recordset.
          return (com.ms.wfc.data.adodb._Recordset) rs.getDataSource();
          
        }
        catch( AdoException adoEX )
        {
          // Log errors here.
        }
        return null;
      }
    }
    					
  2. MTS 或 COM + 程序包中添加 Java COM 对象。
  3. 为应用程序 (VBA) 代码中调用 Java COM 对象与以下 Microsoft Visual Basic:
    Sub TestConnLoss()
    Dim objCL As Object
    Dim i As Long
    Dim rs As ADODB.recordset
      set objCL = CreateObject("ConnLoss.ConnLoss")
      For i = 1 To 100
        Set rs = objCL.FindAuthorsLastName("756-30-7391", False)
        Debug.Print rs.Fields("au_lname").Value
        rs.Close
        Set rs = Nothing    
      Next i    
    End Sub
    					
  4. SQL Server 7.0 所在的位置在计算机上运行 Windows NT 性能监视器和下 SQL Server:General Statistics 性能计数器监视用户连接。
  5. 运行 VBA 客户端代码。 此位置 100 的用户连接由生成代码所报告的该值指示的 OLE DB 会话池不能正常工作的 Java COM 对象所使用的 SQL OLE DB 提供程序的 Windows NT 性能监视器。

  6. 更改 FindAuthorsLastName 的第二个参数为 True,以便激活 System.gc() 代码。
  7. 停止并重新启动 MTS 或 COM + 程序包。
  8. 第二次运行 VBA 客户端代码。
在此点只有几个用户连接是由该代码,该值指示该 OLE DB 会话池正常工作的 Java COM 对象调用 System.gc() 时使用的 SQL OLE DB 提供程序生成的。

: 调用 System.gc() 极大地影响性能的 Java COM 对象,因此调用 System.gc() 通常应避免使用时的性能是一个考虑因素。 例如对于业务对象可能进行编码以仅调用的 System.gc() 10 或 100 的每个方法调用以减少在每个方法的调用 System.gc() 的性能影响。 同时,参数化的命令对象的使用可以避免通过硬编码参数值为 SQL 字符串和不使用参数标记为在上面的示例中,这可以避免该问题也。

属性

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