Atualizando exemplo de dados grande
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);
}
}