Freigeben über


Zwischenspeichern von Resultsetdaten – Beispiel

JDBC-Treiber herunterladen

Diese Beispielanwendung des Microsoft JDBC-Treibers für SQL Server zeigt, wie Sie ein großes Dataset aus einer Datenbank abrufen können. Anschließend kann mithilfe der setFetchSize-Methode des SQLServerResultSet-Objekts die Anzahl der Datenzeilen gesteuert werden, die auf dem Client zwischengespeichert werden.

Hinweis

Die Einschränkung der im Client zwischengespeicherten Zeilen ist nicht mit der Einschränkung der Gesamtanzahl von Zeilen identisch, die ein Resultset enthalten kann. Verwenden Sie zum Steuern der Gesamtanzahl der in einem Resultset enthaltenen Zeilen die Methode setMaxRows des Objekts SQLServerStatement, das von den Objekten SQLServerPreparedStatement und SQLServerCallableStatement geerbt wird.

Zum Festlegen eines Grenzwerts für die Anzahl von Zeilen, die auf dem Client zwischengespeichert wurden, geben Sie einen Cursortyp an, der beim Erstellen von Anweisungsobjekten einen serverseitigen Cursor verwendet. Der JDBC-Treiber enthält beispielsweise den Cursortyp TYPE_SS_SERVER_CURSOR_FORWARD_ONLY (ein schneller schreibgeschützter serverseitiger Vorwärtscursor für SQL Server-Datenbanken).

Hinweis

Alternativ zum SQL Server-spezifischen Cursortyp kann die selectMethod-Verbindungszeichenfolgeneigenschaft verwendet werden, indem deren Wert auf "cursor" festgelegt wird. Weitere Informationen zu den vom JDBC-Treiber unterstützten Cursortypen finden Sie unter Grundlegendes zu Cursortypen.

Nachdem die Abfrage im Statement-Objekt ausgeführt und die Daten als Resultset an den Client zurückgegeben wurden, können Sie setFetchSize aufrufen und den aus der Datenbank abgerufenen Umfang der Daten steuern. Wenn Sie beispielsweise über eine Tabelle mit 100 Datenzeilen verfügen und die Abrufgröße 10 beträgt, werden nur 10 Datenzeilen gleichzeitig auf dem Client zwischengespeichert. Obwohl diese Einstellung die Geschwindigkeit, in der die Daten verarbeitet werden, verlangsamen kann, wird weniger Arbeitsspeicher auf dem Client verbraucht. Dieses Szenario ist nützlich, wenn Sie große Datenmengen verarbeiten müssen, ohne zu viel Arbeitsspeicher zu verwenden.

Die Codedatei für dieses Beispiel heißt „CacheResultSet.java“ und befindet sich im folgenden Pfad:

\<installation directory>\sqljdbc_<version>\<language>\samples\resultsets

Anforderungen

Wenn Sie diese Beispielanwendung ausführen möchten, nehmen Sie die Datei „mssql-jdbc.jar“ in den Klassenpfad auf. Darüber hinaus benötigen Sie Zugriff auf die AdventureWorks2022-Beispieldatenbank. Weitere Informationen zum Festlegen des Klassenpfads finden Sie unter mit dem JDBC-Treiber.

Hinweis

Der Microsoft JDBC-Treiber für SQL Server enthält die Klassenbibliotheksdateien „mssql-jdbc“ für die jeweilige Verwendung mit Ihren bevorzugten JRE-Einstellungen (Java Runtime Environment). Weitere Informationen zum Auswählen der richtigen JAR-Datei finden Sie unter Systemanforderungen für den JDBC-Treiber.

Beispiel

Im folgenden Beispielcode wird eine Verbindung mit der AdventureWorks2022-Beispieldatenbank hergestellt. Anschließend wird eine SQL-Anweisung mit dem SQLServerStatement-Objekt verwenden, der serverseitige Cursortyp angegeben und anschließend die SQL-Anweisung ausgeführt. Die Daten werden in einem SQLServerResultSet-Objekt zurückgegeben.

Danach wird die benutzerdefinierte timerTest-Methode aufgerufen, wobei die zu verwendende Abrufgröße und das Resultset als Argumente übergeben werden. Die timerTest-Methode legt dann die Abrufgröße des Resultsets mithilfe der setFetchSize-Methode sowie die Startzeit des Tests fest. Anschließend wird das Resultset mit einer While-Schleife durchlaufen. Unmittelbar nachdem die While-Schleife verlassen wurde, wird die Beendigungszeit des Tests festgelegt. Anschließend wird das Testergebnis einschließlich Abrufgröße, der Anzahl verarbeiteter Zeilen und der Zeit für die Testausführung angezeigt.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import com.microsoft.sqlserver.jdbc.SQLServerResultSet;

public class CacheResultSet {

    @SuppressWarnings("serial")
    public static void main(String[] args) {

        // Create a variable for the connection string.
        String connectionUrl = "jdbc:sqlserver://<server>:<port>;encrypt=true;databaseName=AdventureWorks;user=<user>;password=<password>";

        try (Connection con = DriverManager.getConnection(connectionUrl);
                Statement stmt = con.createStatement(SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLY, SQLServerResultSet.CONCUR_READ_ONLY);) {

            String SQL = "SELECT * FROM Sales.SalesOrderDetail;";

            for (int n : new ArrayList<Integer>() {
                {
                    add(1);
                    add(10);
                    add(100);
                    add(1000);
                    add(0);
                }
            }) {
                // Perform a fetch for every nth row in the result set.
                try (ResultSet rs = stmt.executeQuery(SQL)) {
                    timerTest(n, rs);
                }
            }
        }
        // Handle any errors that may have occurred.
        catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private static void timerTest(int fetchSize,
            ResultSet rs) throws SQLException {

        // Declare the variables for tracking the row count and elapsed time.
        int rowCount = 0;
        long startTime = 0;
        long stopTime = 0;
        long runTime = 0;

        // Set the fetch size then iterate through the result set to
        // cache the data locally.
        rs.setFetchSize(fetchSize);
        startTime = System.currentTimeMillis();
        while (rs.next()) {
            rowCount++;
        }
        stopTime = System.currentTimeMillis();
        runTime = stopTime - startTime;

        // Display the results of the timer test.
        System.out.println("FETCH SIZE: " + rs.getFetchSize());
        System.out.println("ROWS PROCESSED: " + rowCount);
        System.out.println("TIME TO EXECUTE: " + runTime);
        System.out.println();
    }
}

Siehe auch

Arbeiten mit Resultsets