Freigeben über


Verwenden der adaptiven Pufferung

Die adaptive Pufferung ist ein neues Feature von Microsoft SQL Server 2005 JDBC Driver Version 1.2. Damit können alle Daten mit großen Werten ohne den Aufwand für Servercursor abgerufen werden.

Wenn Microsoft SQL Server 2005 JDBC Driver eine Abfrage ausführt, ruft der Treiber normalerweise alle Ergebnisse vom Server in einen Anwendungsspeicher ab. Obwohl bei diesem Ansatz die Ressourcenauslastung für SQL Server reduziert wird, kann ein OutOfMemoryError in der JDBC-Anwendung für die Abfragen ausgelöst werden, bei denen sehr große Ergebnisse zurückgegeben werden.

Damit Anwendungen sehr große Ergebnisse behandeln können, stellt Microsoft SQL Server 2005 JDBC Driver Version 1.2 die adaptive Pufferung bereit. Anwendungsentwickler können die adaptive Pufferung aus den folgenden Gründen mit einer Anweisung verwenden:

  • Die Abfrage erzeugt ein sehr großes Resultset: Die Anwendung kann eine SELECT-Anweisung ausführen, die mehr Zeilen zurückgibt als im Speicher der Anwendung gespeichert werden können. In vorherigen Versionen musste die Anwendung einen Servercursor verwenden, um einen OutOfMemoryError zu vermeiden. In Version 1.2 kann die Anwendung stattdessen die adaptive Pufferung verwenden. Die adaptive Pufferung stellt die Möglichkeit bereit, ein beliebig großes Resultset vorwärts und schreibgeschützt zu übergeben, ohne dass ein Servercursor erforderlich ist.

  • Die Abfrage erzeugt sehr große SQLServerResultSet -Spalten oder SQLServerCallableStatement -OUT-Parameterwerte: Die Anwendung kann einen Wert (Spalte oder OUT-Parameter) abrufen, der zu groß ist, um vollständig im Anwendungsspeicher gespeichert zu werden. Durch die adaptive Pufferung kann die Clientanwendung solche Werte als Stream mithilfe der Methoden getAsciiStream, getBinaryStream, oder getCharacterStream abrufen. Die Anwendung ruft den Wert beim Lesen des Streams vom SQL Server ab.

Festlegen der adaptiven Pufferung

Es gibt drei Möglichkeiten, wie eine Anwendung anfordern kann, dass bei der Anweisungsausführung die adaptive Pufferung verwendet werden soll:

Wenn große Werte einmal mithilfe der get<Typ>Stream-Methoden gelesen werden und auf die ResultSet-Spalten und die CallableStatement-OUT-Parameter in der Reihenfolge zugegriffen wird, in der sie von SQL Server zurückgegeben werden, minimiert die adaptive Pufferung die Anwendungsspeicherauslastung beim Verarbeiten der Ergebnisse. Beim Verwenden der adaptiven Pufferung:

  • Die in der SQLServerResultSet-Klasse und der SQLServerCallableStatement-Klasse definierten get<Type>Stream-Methoden geben schreibgeschützte Streams zurück, die zurückgesetzt werden können, wenn sie von der Anwendung gekennzeichnet werden. Wenn in der Anwendung reset für den Stream ausgeführt werden soll, muss zunächst die mark-Methode für diesen Stream aufgerufen werden.

  • Die in der SQLServerClob-Klasse und der SQLServerBlob-Klasse definierten get<Type>Stream-Methoden geben Streams zurück, die immer wieder an der Anfangsposition des Streams positioniert werden können, ohne die mark-Methode aufzurufen.

Wenn die Anwendung adaptive Pufferung verwendet, können die von den get<Type>Stream-Methoden abgerufenen Werte nur einmal abgerufen werden. Wenn Sie versuchen, eine get<Type>-Methode für die gleiche Spalte oder den gleichen Parameter aufzurufen, nachdem die get<Type>Stream-Methode des gleichen Objekts aufgerufen wurde, wird eine Ausnahme mit der folgenden Meldung ausgelöst: "Auf die Daten wurde zugegriffen; sie sind für diese Spalte oder diesen Parameter nicht verfügbar."

Minimieren der Anwendungsspeicherauslastung

Entwickler sollten sich an diese wichtigen Richtlinien halten, um die Speicherauslastung durch die Anwendung zu minimieren:

  • Vermeiden Sie die Verwendung der Verbindungszeichenfolgeneigenschaft selectMethod=cursor, damit die Anwendung ein sehr großes Resultset verarbeiten kann. Das Feature für die adaptive Pufferung von Microsoft SQL Server 2005 JDBC Driver Version 1.2 ermöglicht Anwendungen, sehr große, schreibgeschützte Vorwärtsresultsets ohne die Verwendung eines Servercursors zu verarbeiten.

  • Lesen Sie große Text- oder Binärwerte als Streams mithilfe der Methoden getAsciiStream, getBinaryStream, oder getCharacterStream anstelle der getBlob-Methode oder der getClob-Methode. In Version 1.2 stellt die SQLServerCallableStatement-Klasse neue get<Type>Stream-Methoden hierfür bereit.

  • Stellen Sie sicher, dass Spalten mit potenziell großen Werten in der Liste der Spalten in einer SELECT-Anweisung am Ende platziert werden und dass die get<Type>Stream-Methoden von SQLServerResultSet verwendet werden, um in der Reihenfolge auf die Spalten zuzugreifen, in der sie ausgewählt werden.

  • Stellen Sie sicher, dass OUT-Parameter mit potenziell großen Werten in der Liste der Parameter im SQL zum Erstellen von SQLServerCallableStatement zuletzt deklariert werden. Stellen Sie außerdem sicher, dass die get<Type>Stream-Methoden von SQLServerCallableStatement verwendet werden, um auf die OUT-Parameter in der Reihenfolge zuzugreifen, in der sie deklariert wurden.

  • Vermeiden Sie, gleichzeitig mehrere Anweisungen über die gleiche Verbindung auszuführen. Das Ausführen einer weiteren Anweisung vor dem Verarbeiten der Ergebnisse der vorhergehenden Anweisung kann dazu führen, dass nicht verarbeitete Ergebnisse im Anwendungsspeicher gepuffert werden.

Siehe auch

Andere Ressourcen

Verbessern von Leistung und Zuverlässigkeit mit dem JDBC-Treiber