Partager via


Exemple de mise en cache des données d'un jeu de résultats

Télécharger le pilote JDBC

Cet exemple d’application du pilote Microsoft JDBC pour SQL Server montre comment récupérer un grand jeu de données à partir d’une base de données. Il contrôle ensuite le nombre de lignes de données dans le cache sur le client en utilisant la méthode setFetchSize de l’objet SQLServerResultSet.

Notes

Limiter le nombre de lignes mises en cache sur le client et limiter le nombre total de lignes qu'un jeu de résultats peut contenir sont deux choses différentes. Pour contrôler le nombre total de lignes contenues dans un jeu de résultats, utilisez la méthode setMaxRows de l’objet SQLServerStatement, héritée par les objets SQLServerPreparedStatement et SQLServerCallableStatement.

Pour définir une limite sur le nombre de lignes dans le cache sur le client, spécifiez un type de curseur qui utilise un curseur côté serveur pendant la création d’objets Statement. Par exemple, le pilote JDBC fournit le type de curseur TYPE_SS_SERVER_CURSOR_FORWARD_ONLY, qui est un curseur côté serveur d’avance rapide uniquement et en lecture seule, à utiliser avec les bases de données SQL Server.

Notes

Une alternative à l'utilisation d'un type de curseur spécifique à SQL Server est l'utilisation de la propriété de chaîne de connexion selectMethod, en définissant sa valeur sur « curseur ». Pour plus d’informations sur les types de curseurs pris en charge par le pilote JDBC, consultez Présentation des types de curseurs.

Une fois que vous avez exécuté la requête de l’objet Statement et que les données ont été retournées au client sous forme de jeu de résultats, appelez setFetchSize pour contrôler la quantité de données extraites de la base de données en une fois. Par exemple, si une table contient 100 lignes de données et que la taille d’extraction est 10, seules 10 lignes de données sont mises en cache sur le client à la fois. Bien que ce paramètre puisse ralentir le traitement des données, il utilise moins de mémoire sur le client. Ce scénario est utile quand vous devez traiter de grandes quantités de données sans utiliser trop de mémoire.

Le fichier de code de cet exemple est nommé CacheResultSet.java et se trouve à l’emplacement suivant :

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

Configuration requise

Pour exécuter cet exemple d’application, définissez le classpath de sorte à ajouter le fichier jar mssql-jdbc. Vous devez également avoir accès à l’exemple de base de données AdventureWorks2022. Pour plus d’informations sur la façon de définir l’instruction classpath, consultez à l’aide du pilote JDBC.

Notes

Le Pilote Microsoft JDBC pour SQL Server fournit les fichiers bibliothèques de classes mssql-jdbc à utiliser en fonction des paramètres JRE (Java Runtime Environment) choisis. Pour plus d’informations sur le fichier JAR à choisir, voir Configuration requise pour le pilote JDBC.

Exemple

Dans l’exemple suivant, le code établit une connexion à l’exemple de base de données AdventureWorks2022. Il utilise ensuite une instruction SQL avec l’objet SQLServerStatement, spécifie le type de curseur côté serveur et exécute l’instruction SQL. Les données sont retournées dans un objet SQLServerResultSet.

Ensuite, l’exemple de code appelle la méthode personnalisée timerTest, en passant comme arguments la taille d’extraction à utiliser et le jeu de résultats. La méthode timerTest définit alors la taille d’extraction du jeu de résultats avec la méthode setFetchSize et définit l’heure de début du test, puis boucle dans le jeu de résultats avec une boucle While. Dès la sortie de la boucle While, le code définit l’heure d’arrêt du test et affiche le résultat du test, notamment la taille d’extraction, le nombre de lignes traitées et la durée d’exécution du test.

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

Voir aussi

Utilisation des jeux de résultats