Actualizar un ejemplo de datos grandes
La aplicación de ejemplo de Microsoft JDBC Driver para SQL Server demuestra cómo actualizar una columna grande en una base de datos.
El archivo de código para este ejemplo se denomina UpdateLargeData.java y se encuentra en la siguiente ubicación:
\<installation directory>\sqljdbc_<version>\<language>\samples\adaptive
Requisitos
Para ejecutar esta aplicación de ejemplo, tendrá que acceder a la base de datos de ejemplo AdventureWorks2022. También deberá establecer la ruta de clase para incluir el archivo sqljdbc4.jar. Si en la ruta de clase falta una entrada para sqljdbc4.jar, la aplicación de ejemplo produce la excepción común "Clase no encontrada". Para obtener más información sobre cómo establecer la ruta de acceso de clase, consulte Usar el controlador JDBC.
Nota
Microsoft JDBC Driver para SQL Server proporciona los archivos de la biblioteca de clases sqljdbc.jar, sqljdbc4.jar, sqljdbc41.jar o sqljdbc42.jar que hay que usar según su configuración preferida de Java Runtime Environment (JRE). En este ejemplo se usan los métodos isWrapperFor y unwrap, que se incluyen en la API de JDBC 4.0, para obtener acceso a los métodos de almacenamiento en búfer de respuestas específicos del controlador. Para compilar y ejecutar este ejemplo, necesitará la biblioteca de clases sqljdbc4.jar, que proporciona compatibilidad con JDBC 4.0. Para obtener más información acerca del archivo JAR que se debe seleccionar, consulte Requisitos del sistema para el controlador JDBC.
Ejemplo
En el ejemplo siguiente, el código de ejemplo realiza una conexión a la base de datos AdventureWorks2022. Después, el código crea un objeto Statement y usa el método isWrapperFor para comprobar si el objeto es un contenedor de la clase SQLServerStatement especificada. El método unwrap se usa para obtener acceso a los métodos de almacenamiento en búfer de respuestas específicos del controlador.
Después, el código establece el modo de almacenamiento en búfer de respuestas como "adaptive" mediante el uso del método setResponseBuffering de la clase SQLServerStatement, además de mostrar cómo obtener el modo de almacenamiento en búfer adaptable.
Después, ejecuta la instrucción SQL y coloca los datos que devuelve en un objeto SQLServerResultSet actualizable.
Finalmente, el código itera por las filas de datos que se encuentran en el conjunto de resultados. Si encuentra un resumen de documento vacío, usa la combinación de los métodos updateString y updateRow para actualizar las filas de datos y vuelve a almacenar los datos en la base de datos. Si ya hay datos, usa el método getString para mostrar algunos de los datos.
El comportamiento predeterminado del controlador es “adaptable”. Sin embargo, para los conjuntos de resultados adaptables de solo avance y cuando los datos del conjunto de resultados son mayores que la memoria de la aplicación, la aplicación tiene que configurar explícitamente el modo de almacenamiento en búfer adaptable mediante el método setResponseBuffering de la clase 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);
}
}