Berichtigung: Verbindungslücke bei WFC ADO COM-Komponenten in MTS

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 247757 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde zuvor veröffentlicht unter D247757
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
247757 FIX: Connection Leak with WFC ADO COM Components in MTS
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Wird beim Verwenden von Windows Foundation-Klassen für Java (WFC) und ADO ein Datensatz mittels eines mit Parametern versehenem Befehlsobjekt geöffnet, werden Verbindungen, die korrekt geschlossen wurden, nicht korrekt gepoolt und wiederhergestellt und führen zu Verbindungslücken. Rufen Sie System.gc() auf, nachdem Sie die ADO-Verbindung in Ihrem Java COM-Objekt geschlossen haben, um dieses Problem zu beheben. Normalerweise ist es nicht nötig, System.gc() nach dem Schließen einer ADO-Verbindung aufzurufen, um die Verbindung zu beenden.

Ursache

Microsoft hat bestätigt, dass es sich dabei um ein Problem bei den Microsoft-Produkten handelt, die zu Beginn dieses Artikels aufgeführt sind.

Lösung

Eine unterstützte Berichtigung für dieses Problem ist von Microsoft erhältlich. Diese Berichtigung ist jedoch noch nicht vollständig regressionsgeprüft und sollte daher nur bei Systemen angewendet werden, bei denen dieses spezielle Problem auftritt. Wenden Sie sich an den Microsoft Produkt Support, um dieses Problem zu lösen und die Berichtigung zu erhalten.

Eine vollständige Liste mit Telefonnummern des Microsoft Software Service finden Sie im Internet unter der folgenden Adresse:

http://support.microsoft.com/default.aspx?scid=fh;DE;PHONENUMBERS

Status

Weitere Informationen

Dieses Verbindungs-/Sitzungsproblem tritt auf, wenn alle der folgenden Bedingungen zutreffen:
  1. Microsoft Data Access Objects 2.1 Servicepack 2 ist installiert.
  2. Ein ADO-Befehlsobjekt wird mit Parametern verwendet.
  3. Das Java-COM-Objekt wird in MTS oder COM+ gehostet.
  4. Das Java COM-Objekt erstellt einen getrennten Datensatz.

Zum Reproduzieren des Problems notwendige Schritte

  1. Erstellen Sie ein Projekt für ein Java COM-Objekts namens ConnLoss mit Viusal J++ 6.0 und verwenden Sie folgenden Code:
    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. Fügen Sie das Java Com-Objekt dem MTS- oder COM+-Paket hinzu.
  3. Rufen Sie das Java COM-Objekt mithilfe des folgenden Microsoft Visual Basic for Applications (VBA)-Code auf:
    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. Starten Sie den Windows NT Systemmonitor auf dem Rechner, auf dem SQL Server 7.0 installiert ist, und überwachen Sie die Benutzerverbindungen (User Connections) im Bereich SQL Server: Allgemeine Statistiken (SQL Server: General Statistics) des Leistungsindikators (performance counter).
  5. Führen Sie den VBA Client-Code aus. Zu diesem Zeitpunkt werden, wie vom Windows NT Systemmonitor berichtet, 100 Benutzerverbindungen vom Code erzeugt; dies zeigt an, dass das OLE DB Session Pooling für den SQL OLE DB-Provider, der von dem Java COM-Objekt verwendet wird, nicht richtig funktioniert.

  6. Zu diesem Zeitpunkt werden, wie vom Windows NT Systemmonitor berichtet, 100 Benutzerverbindungen vom Code erzeugt; dies zeigt an, dass das OLE DB Session Pooling für den SQL OLE DB-Provider, der von dem Java COM-Objekt verwendet wird, nicht richtig funktioniert. Ändern Sie den zweiten Parameter von FindAuthorsLastName auf True, um den System.gc()-Code zu aktivieren.
  7. Zu diesem Zeitpunkt werden, wie vom Windows NT Systemmonitor berichtet, 100 Benutzerverbindungen vom Code erzeugt; dies zeigt an, dass das OLE DB Session Pooling für den SQL OLE DB-Provider, der von dem Java COM-Objekt verwendet wird, nicht richtig funktioniert. Beenden Sie das MTS- oder COM+-Paket, und starten Sie es erneut.
  8. Zu diesem Zeitpunkt werden, wie vom Windows NT Systemmonitor berichtet, 100 Benutzerverbindungen vom Code erzeugt; dies zeigt an, dass das OLE DB Session Pooling für den SQL OLE DB-Provider, der von dem Java COM-Objekt verwendet wird, nicht richtig funktioniert. Führen Sie den VBA Client-Code ein zweites Mal aus. Run the VBA client code a second time.
Zu diesem Zeitpunkt werden von dem Code nur wenige Benutzerverbindungen erstellt; dies zeigt an, dass das OLE DB Session Pooling für den SQL OLE DB-Provider, der von dem Java COM-Objekt verwendet wird, korrekt funktioniert, wenn System.gc() aufgerufen wird.

Anmerkung : Der Aufruf von System.gh() hat einen großen Leistungsverlust des Java COM-Objektes zur Folge, weshalb der Aufruf von System.gh() im Allgemeinen vermieden werden sollte. Zum Beispiel könnte das Business-Objekt so programmiert werden, dass Systems.gc() nur in jedem 10. oder 100. Methodenaufruf aufgerufen wird, um Leistungsverluste pro Methode durch einen Aufruf von Systems.gh() zu reduzieren. Außerdem kann anstelle eines Befehlsobjekts mit Parametern ein SQL-String gleich mit festen Parameterwerten programmiert werden und nicht. Im Gegensatz zum obigen Beispiel, in dem Parameter-Token verwendet werden, vermeidet diese Lösung das Problem.

Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.

Eigenschaften

Artikel-ID: 247757 - Geändert am: Sonntag, 23. Februar 2014 - Version: 5.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Data Access Components 2.1 Service Pack 2
  • Microsoft Visual J++ 6.0 Standard Edition
Keywords: 
kbnosurvey kbarchive kbqfe kbhotfixserver kbado210sp2bug kbgrpjava kbmts KB247757
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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