Atualizando exemplo de dados grande

Baixar o JDBC Driver

Este aplicativo de exemplo do Driver JDBC da Microsoft para SQL Server demonstra como atualizar uma coluna grande em um banco de dados.

O arquivo de código desta amostra chama-se UpdateLargeData.java e pode ser encontrado no seguinte local:

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

Requisitos

Para executar este aplicativo de exemplo, você precisará ter acesso ao banco de dados de exemplo AdventureWorks2022. Você também precisará definir o classpath para incluir o arquivo sqljdbc4.jar. Se no classpath faltar uma entrada para sqljdbc4.jar, o aplicativo de exemplo lançará a exceção comum "Class not found". Para obter mais informações sobre como definir o caminho de classe, confira Como usar o JDBC Driver.

Observação

O Driver JDBC da Microsoft para SQL Server fornece arquivos de biblioteca de classes sqljdbc.jar, sqljdbc4.jar, sqljdbc41.jar ou sqljdbc42.jar a serem usados dependendo das configurações do JRE (Java Runtime Environment) preferidas. Esta amostra usa os métodos isWrapperFor e unwrap, que são introduzidos na API do JDBC 4.0, para acessar os métodos de buffer de resposta específicos do driver. A fim de compilar e executar este exemplo, você precisará da biblioteca de classes sqljdbc4.jar que oferece suporte para JDBC 4.0. Para saber mais sobre qual arquivo JAR escolher, confira os requisitos do sistema para o JDBC Driver.

Exemplo

No exemplo a seguir, o código de exemplo faz uma conexão com o banco de dados AdventureWorks2022. Em seguida, o código de exemplo cria um objeto Statement e usa o método isWrapperFor para verificar se o objeto Statement é um wrapper para a classe SQLServerStatement especificada. O método unwrap é usado para acessar os métodos de buffer de resposta específicos do driver.

Em seguida, o código de exemplo define o modo de buffer de resposta como "adaptável" usando o método setResponseBuffering da classe SQLServerStatement e também demonstra como obter o modo de buffer adaptável.

Em seguida, ele executa a instrução SQL e coloca os dados retornados em um objeto SQLServerResultSet atualizável.

Por fim, o código de exemplo itera pelas linhas de dados do conjunto de resultados. Se ele localizar um resumo vazio do documento, usará a combinação dos métodos updateString e updateRow para atualizar a linha de dados e novamente persisti-la no banco de dados. Se já houver dados, usará o método getString para exibir alguns dos dados.

O comportamento padrão do driver é "adaptável." Porém, para os conjuntos de resultados atualizáveis apenas de encaminhamento e quando os dados no conjunto de resultados são maiores que a memória de aplicativo, o aplicativo precisa definir o modo de buffer adaptável explicitamente usando o método setResponseBuffering da 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);
    }
}

Confira também

Manipular dados grandes