Partager via


Exemple de mise à jour de données volumineuses

Télécharger le pilote JDBC

Cet exemple d'application du pilote Microsoft JDBC pour SQL Server montre comment mettre à jour une colonne volumineuse dans une base de données.

Le fichier de code pour cet exemple se nomme UpdateLargeData.java et se trouve à l’emplacement suivant :

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

Configuration requise

Pour exécuter cet exemple d’application, l’accès à l’exemple de base de données AdventureWorks2022 est nécessaire. Vous devez également définir l'instruction classpath de façon à inclure le fichier sqljdbc4.jar. Si l'instruction classpath n'a pas d'entrée pour sqljdbc4.jar, l'exemple d'application lève l'exception usuelle « Classe introuvable ». 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èque de classes sqljdbc.jar, sqljdbc4.jar, sqljdbc41.jar ou sqljdbc42.jar, à utiliser en fonction de vos paramètres JRE (Java Runtime Environment) préférés. Cet exemple utilise les méthodes isWrapperFor et unwrap, qui sont introduites dans l’API JDBC 4.0, pour accéder aux méthodes de mise en mémoire tampon des réponses spécifiques aux pilotes. Pour pouvoir compiler et exécuter cet exemple, vous devez disposer de la bibliothèque de classes sqljdbc4.jar, qui assure la prise en charge de JDBC 4.0. 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 à la base de données AdventureWorks2022. L’exemple de code crée ensuite un objet Statement et utilise la méthode isWrapperFor pour vérifier si l’objet Statement est un wrapper pour la classe SQLServerStatement spécifiée. La méthode unwrap permet d’accéder aux méthodes de mise en mémoire tampon des réponses spécifiques aux pilotes.

L’exemple de code définit ensuite le mode de mise en mémoire tampon des réponses comme étant adaptatif avec la méthode setResponseBuffering de la classe SQLServerStatement ; il montre également comment obtenir le mode de mise en mémoire tampon adaptatif.

Il exécute ensuite l’instruction SQL et place les données retournées dans un objet SQLServerResultSet pouvant être mis à jour.

Pour finir, l’exemple de code boucle dans les lignes de données du jeu de résultats. S’il trouve un résumé de document vide, il utilise la combinaison des méthodes updateString et updateRow pour mettre à jour la ligne de données et la réenregistrer dans la base de données. Si des données sont déjà présentes, l’exemple utilise la méthode getString pour afficher une partie des données.

Le comportement par défaut du pilote est « évolutif ». Toutefois, pour les jeux de résultats de type avant uniquement pouvant être mis à jour et lorsque la taille des données du jeu de résultats est supérieure à la capacité de la mémoire de l'application, cette dernière doit définir le mode de mise en mémoire tampon adaptative de manière explicite à l'aide de la méthode setResponseBuffering de la classe SQLServerStatement.

import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.microsoft.sqlserver.jdbc.SQLServerStatement;


public class UpdateLargeData {

    public static void main(String[] args) {

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

        // Establish the connection.
        try (Connection con = DriverManager.getConnection(connectionUrl); Statement stmt = con.createStatement();
                Statement stmt1 = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);) {

            createTable(stmt);

            // Since the summaries could be large, we should make sure that
            // the driver reads them incrementally from a database,
            // even though a server cursor is used for the updatable result sets.

            // The recommended way to access the Microsoft JDBC Driver for SQL Server
            // specific methods is to use the JDBC 4.0 Wrapper functionality.
            // The following code statement demonstrates how to use the
            // Statement.isWrapperFor and Statement.unwrap methods
            // to access the driver specific response buffering methods.

            if (stmt.isWrapperFor(com.microsoft.sqlserver.jdbc.SQLServerStatement.class)) {
                SQLServerStatement SQLstmt = stmt.unwrap(com.microsoft.sqlserver.jdbc.SQLServerStatement.class);

                SQLstmt.setResponseBuffering("adaptive");
                System.out.println("Response buffering mode has been set to " + SQLstmt.getResponseBuffering());
            }

            // Select all of the document summaries.
            try (ResultSet rs = stmt1.executeQuery("SELECT Title, DocumentSummary FROM Document_JDBC_Sample")) {

                // Update each document summary.
                while (rs.next()) {

                    // Retrieve the original document summary.
                    try (Reader reader = rs.getCharacterStream("DocumentSummary")) {

                        if (reader == null) {
                            // Update the document summary.
                            System.out.println("Updating " + rs.getString("Title"));
                            rs.updateString("DocumentSummary", "Work in progress");
                            rs.updateRow();
                        }
                    }
                }
            }
        }
        // Handle any errors that may have occurred.
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void createTable(Statement stmt) throws SQLException {
        stmt.execute("if exists (select * from sys.objects where name = 'Document_JDBC_Sample')"
                + "drop table Document_JDBC_Sample");

        String sql = "CREATE TABLE Document_JDBC_Sample (" + "[DocumentID] [int] NOT NULL identity,"
                + "[Title] [char](50) NOT NULL," + "[DocumentSummary] [varchar](max) NULL)";

        stmt.execute(sql);

        sql = "INSERT Document_JDBC_Sample VALUES ('title1','summary1') ";
        stmt.execute(sql);

        sql = "INSERT Document_JDBC_Sample (title) VALUES ('title2') ";
        stmt.execute(sql);

        sql = "INSERT Document_JDBC_Sample (title) VALUES ('title3') ";
        stmt.execute(sql);

        sql = "INSERT Document_JDBC_Sample VALUES ('title4','summary3') ";
        stmt.execute(sql);
    }
}

Voir aussi

Utilisation de données volumineuses