Esempio di memorizzazione nella cache dei dati dei set di risultati

Scaricare il driver JDBC

In questa applicazione di esempio del driver Microsoft JDBC per SQL Server viene illustrato come recuperare un set di dati di grandi dimensioni da un database. Viene quindi controllato il numero di righe di dati memorizzate nella cache del client tramite il metodo setFetchSize dell'oggetto SQLServerResultSet.

Nota

La limitazione del numero di righe inserite nella cache del client è un'operazione diversa dalla limitazione del numero totale di righe contenute in un set di risultati. Per controllare il numero totale di righe contenute in un set di risultati, usare il metodo setMaxRows dell'oggetto SQLServerStatement, ereditato dagli oggetti SQLServerPreparedStatement e SQLServerCallableStatement.

Per impostare un limite sul numero di righe memorizzate nella cache nel client, specificare un tipo di cursore che usa un cursore lato server durante la creazione di oggetti Istruzione. Ad esempio, nel driver JDBC è disponibile il tipo di cursore TYPE_SS_SERVER_CURSOR_FORWARD_ONLY, ovvero un cursore lato server di sola lettura, fast forward only, da usare con i database SQL Server.

Nota

Un'alternativa all'utilizzo del tipo di cursore specifico per SQL Server è l'utilizzo della proprietà della stringa di connessione selectMethod, impostandone il valore su "cursor". Per altre informazioni sui tipi di cursore supportati dal driver JDBC, vedere Informazioni sui tipi di cursore.

Dopo che è stata eseguita la query nell'oggetto Statement e dopo che al client sono stati restituiti i dati come set di risultati, chiamare setFetchSize per controllare la quantità dei dati recuperati contemporaneamente dal database. Ad esempio, se si dispone di una tabella che contiene 100 righe di dati e la dimensione del recupero è 10, verranno inserite nella cache del client solo 10 righe di dati in qualsiasi momento. Anche se questa impostazione può rallentare la velocità con cui vengono elaborati i dati, usa meno memoria nel client. Questo scenario è utile quando è necessario elaborare grandi quantità di dati senza usare troppo memoria.

Il file di codice per questo esempio è CacheResultSet.java, disponibile nel percorso seguente:

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

Requisiti

Per eseguire questa applicazione di esempio, impostare il classpath in modo da includere il file con estensione jar mssql-jdbc. È anche necessario l'accesso al database di esempio AdventureWorsk2022. Per altre informazioni su come impostare il classpath, vedere Uso del driver JDBC.

Nota

Microsoft JDBC Driver per SQL Server fornisce i file di libreria di classi mssql-jdbc da usare a seconda delle impostazioni preferite di Java Runtime Environment (JRE). Per altre informazioni su quale file JAR scegliere, vedere Requisiti di sistema per il driver JDBC.

Esempio

Nell'esempio seguente il codice di esempio effettua una connessione al database di esempio AdventureWorks2022. Viene quindi usata un'istruzione SQL con l'oggetto SQLServerStatement, viene specificato il tipo di cursore lato server, quindi viene eseguita l'istruzione SQL. I dati vengono restituiti in un oggetto SQLServerResultSet.

Il codice di esempio esegue quindi una chiamata al metodo timerTest personalizzato, passando come argomenti la dimensione di recupero da usare e il set di risultati. Il metodo timerTest imposta quindi la dimensione di recupero del set di risultati tramite il metodo setFetchSize, imposta l'ora di inizio del test e quindi scorre il set di risultati con un ciclo While. Non appena terminato il ciclo While, viene impostata l'ora di fine del test e quindi viene visualizzato il risultato del test stesso con le dimensioni di recupero, il numero di righe elaborate e il tempo impiegato per l'esecuzione.

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();
    }
}

Vedi anche

Uso dei set di risultati