CORRECTIF : Fuite de connexion lors de l'utilisation d'une commande paramétrée dans ADO

Traductions disponibles Traductions disponibles
Numéro d'article: 247757 - Voir les produits auxquels s'applique cet article
Ancien nº de publication de cet article : F247757
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Agrandir tout | Réduire tout

Sommaire

Symptômes

Lorsque vous utilisez Windows Foundation Classes pour Java (WFC) et ADO, et que vous ouvrez un jeu d'enregistrements à l'aide d'un objet de commande paramétré, les connexions qui sont correctement fermées ne sont pas correctement concentrées et recyclées, provoquant ainsi une fuite de connexions. Pour contourner ce problème, appelez System.gc() après avoir fermé la connexion ADO dans votre objet Java COM. Généralement, après avoir fermé une connexion ADO, vous n'avez pas besoin d'appeler System.gc() pour libérer la connexion.

Résolution

Ce problème est corrigé dans les derniers Services Packs pour Windows 2000 et MDAC 2.5.
  • Pour résoudre ce problème, procurez-vous le dernier Service Pack de Windows 2000. Pour plus d'informations, consultez l'article suivant dans la Base de connaissances Microsoft :
    260910 Procédures pour obtenir le dernier Service Pack de Windows 2000
  • Pour résoudre ce problème, procurez-vous le dernier Service Pack pour Microsoft Data Access Components 2.5. Pour plus d'informations, consultez l'article suivant dans la Base de connaissances Microsoft :
    293312 INFO : Procédures pour obtenir le dernier Service Pack de MDAC 2.5
La version anglaise de ce correctif doit disposer des attributs de fichier suivants ou de ceux d'une version ultérieure :
Nom de fichier       Date       Taille      Version       
-----------------------------------------------------
Msado15.dll 
    26/01/2000   329 Ko     2.12.4926.0

Statut

Microsoft a confirmé l'existence de ce problème dans Microsoft Data Access Objects 2.1 SP2 et 2.5. Ce problème a d'abord été corrigé dans le Service Pack 2 de Microsoft Data Access Components 2.5 et le Service Pack 2 de Microsoft Windows 2000.

Plus d'informations

Ce problème de pool de connexion/session se produit lorsque toutes les conditions suivantes sont présentes :
  1. Microsoft Data Access Objects 2.1 SP2 est installé.
  2. Un objet de commande ADO paramétré est utilisé.
  3. L'objet Java COM est hébergé dans MTS ou COM+.
  4. L'objet Java COM crée un jeu d'enregistrements déconnecté.

Étapes à suivre pour reproduire ce comportement



  1. Créez un projet d'objet Java COM nommé ConnLoss avec Visual J++ 6.0 en utilisant le code suivant :
    import com.ms.wfc.data.*;
    public class ConnLoss
    {
      // Modifiez cette chaîne de 
    connexion pour pointer vers un serveur SQL en cours d'exécution.
      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
        {     
          // Ouvre la connexion à SQL Server.
     
         conn = new Connection();
          conn.setCursorLocation( AdoEnums.CursorLocation.CLIENT 
    );
          conn.open( m_connect );
          
          // Prépare l'objet de commande.
     
         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 
    ) );
          
          // Exécute la commande.
          rs = cmd.execute();
          
        
      // Déconnecte le jeu d'enregistrements et ferme la connexion.
          rs.setActiveConnection( 
    (Connection) null );
          conn.close();
          
          // Appelle gc si nécessaire.
     
         if (fCallGC) System.gc();
          
          // Retourne le jeu d'enregistrements 
    déconnecté.
          return (com.ms.wfc.data.adodb._Recordset) rs.getDataSource();
     
         
        }
        catch( AdoException adoEX )
        {
          // Enregistre les erreurs 
    ici.
        }
        return null;
      }
    }
  2. Ajoutez l'objet Java COM à MTS ou au programme COM+.
  3. Appelez l'objet Java COM avec le code Microsoft Visual Basic pour Applications (VBA) suivant :
    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. Exécutez l'Analyseur de performances Windows NT sur l'ordinateur où est installé SQL Server 7.0 et contrôlez les connexions utilisateur dans le compteur de performances SQL Server : statistiques générales.
  5. Exécutez le code client VBA. À ce stade, 100 connexions utilisateur sont générées par le code comme le signale l'Analyseur de performances Windows NT, indiquant que le pool de session OLE DB ne fonctionne pas correctement pour le fournisseur SQL OLE DB utilisé par l'objet Java COM.

  6. À ce stade, 100 connexions utilisateur sont générées par le code comme le signale l'Analyseur de performances Windows NT, indiquant que le pool de session OLE DB ne fonctionne pas correctement pour le fournisseur SQL OLE DB utilisé par l'objet Java COM. Modifiez le deuxième paramètre de FindAuthorsLastName sur Vrai afin d'activer le code System.gc().
  7. À ce stade, 100 connexions utilisateur sont générées par le code comme le signale l'Analyseur de performances Windows NT, indiquant que le pool de session OLE DB ne fonctionne pas correctement pour le fournisseur SQL OLE DB utilisé par l'objet Java COM. Arrêtez et redémarrez MTS ou le programme COM+.
  8. À ce stade, 100 connexions utilisateur sont générées par le code comme le signale l'Analyseur de performances Windows NT, indiquant que le pool de session OLE DB ne fonctionne pas correctement pour le fournisseur SQL OLE DB utilisé par l'objet Java COM. Exécutez le code client VBA une seconde fois.
À ce stade, seules quelques connexions utilisateur sont générées par le code, indiquant que le pool de session OLE DB fonctionne correctement pour le fournisseur SQL OLE DB utilisé par l'objet Java COM lorsque System.gc() est appelé.

REMARQUE : L'appel de System.gc() a un impact considérable sur la performance de l'objet Java COM. Par conséquent, l'appel de System.gc() doit généralement être évité lorsque la performance entre en ligne de compte. Par exemple, l'objet Société peut être codé pour appeler uniquement System.gc() tous les 10 ou 100 appels à une méthode pour réduire l'impact de performance par méthode de l'appel System.gc(). En outre, l'utilisation d'un objet de commande paramétré peut être évitée par des valeurs de paramètre codées de manière irréversible dans une chaîne SQL et ne pas utiliser des mots clés de paramètre comme dans l'exemple ci-dessus ; le problème est également évité de cette façon.

Propriétés

Numéro d'article: 247757 - Dernière mise à jour: dimanche 23 février 2014 - Version: 3.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Data Access Components 2.1 Service Pack 2
  • Microsoft Data Access Components 2.5
  • Microsoft Visual J++ 6.0 Édition standard
Mots-clés : 
kbnosurvey kbarchive kbbug kbfix kbmdac250sp2fix kbqfe kbmdac250bug kbmts kbgrpdsjava kbado210sp2bug kbhotfixserver KB247757
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

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