Lectura de una muestra grande de datos

Descargar controlador JDBC

Esta aplicación de ejemplo del controlador JDBC de Microsoft para SQL Server muestra cómo recuperar un valor grande de una sola columna desde una base de datos de SQL Server utilizando el método getCharacterStream.

El archivo de código para este ejemplo se denomina ReadLargeData.java y se encuentra en la siguiente ubicación:

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

Requisitos

Para ejecutar esta aplicación de ejemplo, necesitará acceso a la base de datos de ejemplo AdventureWorks2025. También deberá establecer la ruta de clase para incluir el archivo jar mssql-jdbc. Para obtener más información sobre cómo establecer la ruta de acceso de clase, consulte Usar el controlador JDBC.

Nota:

El controlador Microsoft JDBC para SQL Server incluye los archivos de la biblioteca de clases mssql-jdbc para su uso en función de la configuración de Java Runtime Environment (JRE) que prefiera. 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 AdventureWorks2025. A continuación, el código de ejemplo crea datos de ejemplo y actualiza la tabla Production.Document mediante una consulta parametrizada.

Además, en el código se indica cómo establecer el modo de almacenamiento en búfer adaptable con el método getResponseBuffering de la clase SQLServerStatement. Tenga en cuenta que, a partir de la versión 2.0 del controlador JDBC, la propiedad de conexión responseBuffering se establece en "adaptive" de forma predeterminada.

Después, con una instrucción SQL con el objeto SQLServerStatement, el código ejecuta la instrucción SQL y coloca los datos que devuelve en un objeto SQLServerResultSet.

Por último, el código recorre las filas de datos del conjunto de resultados y usa el método getCharacterStream para acceder a algunos de los datos.

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

import com.microsoft.sqlserver.jdbc.SQLServerStatement;

public class ReadLargeData {

    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>";
        
        // Create test data as an example.
        StringBuffer buffer = new StringBuffer(4000);
        for (int i = 0; i < 4000; i++)
            buffer.append((char) ('A'));
        
        try (Connection con = DriverManager.getConnection(connectionUrl);
                Statement stmt = con.createStatement();
                PreparedStatement pstmt = con.prepareStatement("UPDATE Production.Document SET DocumentSummary = ? WHERE (DocumentID = 1)");) {

            pstmt.setString(1, buffer.toString());
            pstmt.executeUpdate();

            // In adaptive mode, the application does not have to use a server cursor
            // to avoid OutOfMemoryError when the SELECT statement produces very large
            // results.

            // Create and execute a SQL statement that returns some data.
            String SQL = "SELECT Title, DocumentSummary FROM Production.Document";

            // Display the response buffering mode.
            SQLServerStatement SQLstmt = (SQLServerStatement) stmt;
            System.out.println("Response buffering mode is: " + SQLstmt.getResponseBuffering());
            SQLstmt.close();

            // Get the updated data from the database and display it.
            ResultSet rs = stmt.executeQuery(SQL);

            while (rs.next()) {
                Reader reader = rs.getCharacterStream(2);
                if (reader != null) {
                    char output[] = new char[40];
                    while (reader.read(output) != -1) {
                        // Do something with the chunk of the data that was
                        // read.
                    }

                    System.out.println(rs.getString(1) + " has been accessed for the summary column.");
                    // Close the stream.
                    reader.close();
                }
            }
        }
        // Handle any errors that may have occurred.
        catch (SQLException | IOException e) {
            e.printStackTrace();
        }
    }
}