CORRECÇÃO: Ligação fuga utilizando o comando com parâmetros de ADO

Traduções de Artigos Traduções de Artigos
Artigo: 247757 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando utilizar o Windows Foundation Classes para Java (WFC) ADO e abrir um conjunto de registos utilizando o comando com parâmetros objecto, ligações que são fechadas correctamente correctamente não são agrupadas e Reciclagem (Recycled), resultando em transmitido ligações. Para contornar este problema, contacte System.gc() depois de fechar a ligação ADO no objecto COM Java. Em situações normais, não é necessário chamar System.gc() depois de fechar uma ligação ADO para libertar a ligação.

Resolução

Este problema foi corrigido no service packs mais recentes para o Windows 2000 e MDAC 2.5.
  • Para resolver este problema, obtenha o service pack mais recente do Windows 2000. Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
    260910Como obter o Service Pack mais recente do Windows 2000
  • Para resolver este problema, obtenha o service pack mais recente do Microsoft Data Access Components 2.5. Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
    293312INFO: Como obter o mais recente MDAC 2.5 Service Pack
A versão inglesa desta correcção deverá ter os seguintes atributos de ficheiro ou posteriores:
File name       Date        Size      Version      
-----------------------------------------------------
Msado15.dll     1/26/2000   329KB     2.12.4926.0
				

Ponto Da Situação

A Microsoft confirmou que este é um problema no Microsoft Data Access Objects2.1 SP2 e 2.5. Este problema foi corrigido pela primeira vez no Microsoft Data Access Components 2.5 Service Pack 2 e Microsoft Windows 2000 Service Pack 2.

Mais Informação

Esta ligação/conjuntos de sessões problema ocorre quando todas as condições seguintes estão presentes:
  1. Microsoft Data Access Objects 2.1 SP2 está instalado.
  2. É utilizado um objecto de comando do ADO com parâmetros.
  3. O objecto COM Java está alojado no MTS ou COM +.
  4. O objecto COM Java cria um conjunto de registos desligado.

Passos para reproduzir o comportamento

  1. Criar um projecto objecto de Java COM nome ConnLoss com Visual 6.0 do J ++ utilizando o seguinte código:
    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. Adicione o objecto COM Java MTS ou o pacote COM +.
  3. Chamar o objecto COM Java com o seguinte Microsoft Visual Basic para código Applications (VBA):
    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. Execute o Monitor de desempenho do Windows NT no computador onde o SQL Server 7.0 está localizado e monitorizar ligações de utilizador sob o contador de desempenho Estatísticas: gerais do servidor de SQL .
  5. Execute o código VBA do cliente. Nesta altura, 100 ligações do utilizador são geradas pelo código à medida que comunicado pelo Monitor de desempenho do Windows NT, indicando que pooling de sessões de OLE DB não está a funcionar correctamente para o fornecedor SQL OLE DB utilizado pelo objecto Java COM.

  6. Altere o segundo parâmetro do FindAuthorsLastName como true para activar o código de System.gc().
  7. Pare e reinicie o pacote MTS ou COM +.
  8. Execute o código VBA do cliente uma segunda vez.
Neste momento só algumas ligações de utilizadores são geradas pelo código, que indica que o agrupamento de sessão de OLE DB está a funcionar correctamente para o fornecedor SQL OLE DB utilizado pelo objecto COM Java quando System.gc() é chamado.

Nota : chamada System.gc() afecta significativamente o desempenho do objecto COM Java, por isso, chamar System.gc() em geral deve ser evitada quando desempenho é uma consideração. Por exemplo, o objecto de negócio pode ser codificado apenas chamar System.gc() cada método 10 ou 100 chamadas para reduzir a por impacto de desempenho de método de chamar System.gc(). Além disso, a utilização de um objecto de comando com parâmetros pode ser evitada por valores de parâmetro rígido codificação para uma cadeia SQL e não utilizar o parâmetro tokens como no exemplo acima; este circumvents assim o problema.

Propriedades

Artigo: 247757 - Última revisão: 23 de fevereiro de 2014 - Revisão: 3.0
A informação contida neste artigo aplica-se a:
  • Microsoft Data Access Components 2.1 Service Pack 2
  • Microsoft Data Access Components 2.5
  • Microsoft Visual J++ 6.0 Standard Edition
Palavras-chave: 
kbnosurvey kbarchive kbmt kbqfe kbhotfixserver kbbug kbfix kbmdac250sp2fix KB247757 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 247757

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