Atualizando exemplo de dados grande

Baixar driver JDBC

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