Compartir a través de


Almacenamiento en caché de ejemplo de datos de conjunto de resultados

Descargar controlador JDBC

La aplicación de ejemplo de Microsoft JDBC Driver para SQL Server demuestra cómo recuperar un conjunto grande de datos desde una base de datos. Posteriormente controla la cantidad de filas de datos que se almacenan en caché en el cliente mediante el método setFetchSize del objeto SQLServerResultSet.

Nota:

La limitación del número de filas almacenadas en la memoria caché del cliente es distinta de la limitación del número total de filas que contiene el conjunto de resultados. Para controlar el número total de filas que contiene un conjunto de resultados, use el método setMaxRows del objeto SQLServerStatement, que heredan los objetos SQLServerPreparedStatement y SQLServerCallableStatement.

Para establecer un límite en el número de filas almacenadas en caché en el cliente, especifique un tipo de cursor que use un cursor del lado servidor al crear objetos Statement. Por ejemplo, JDBC Driver proporciona el tipo de cursor TYPE_SS_SERVER_CURSOR_FORWARD_ONLY, que es un cursor de servidor de solo avance rápido y solo lectura para su uso con las bases de datos de SQL Server.

Nota:

Una alternativa al tipo de cursor específico de SQL Server es usar la propiedad de cadena de conexión selectMethod y establecer su valor en "cursor". Para obtener más información sobre los tipos de cursor compatibles con el controlador JDBC, consulte Descripción de los tipos de cursor.

Una vez ejecutada la consulta en el objeto Statement y devueltos los datos al cliente como un conjunto de resultados, llame a setFetchSize para controlar la cantidad de datos recuperados desde la base de datos cada vez. Por ejemplo, si tiene una tabla que contiene 100 filas de datos y el tamaño de captura es 10, solo se almacenan en la memoria caché del cliente 10 filas de datos a la vez. Aunque esta configuración puede ralentizar la velocidad a la que se procesan los datos, usa menos memoria en el cliente. Este escenario es útil cuando necesita procesar grandes cantidades de datos sin usar demasiada memoria.

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

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

Requisitos

Para ejecutar esta aplicación de ejemplo, establezca la ruta de clase para que incluya el archivo mssql-jdbc.jar. Además, debe acceder a la base de datos de ejemplo AdventureWorks2022. 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 biblioteca de clases mssql-jdbc que se usan según la configuración preferida de Java Runtime Environment (JRE). 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 siguiente ejemplo, el código de ejemplo realiza una conexión a la base de datos de ejemplo AdventureWorks2022. A continuación, usa una instrucción SQL con el objeto SQLServerStatement , especifica el tipo de cursor del lado servidor y ejecuta la instrucción SQL. Los datos se devuelven en un objeto SQLServerResultSet.

Después, el código llama al método timerTest personalizado y pasa como argumentos el tamaño de captura que se va a usar y el conjunto de resultados. El método timerTest establece el tamaño de recuperación del conjunto de resultados con el método setFetchSize, establece la hora de inicio de la prueba y, luego, itera por el conjunto de resultados con un bucle While. En cuanto sale del bucle While, el código establece la hora de detención de la prueba y, después, muestra el resultado de dicha prueba, incluidos el tamaño de recuperación, el número de filas procesadas y el tiempo que se ha tardado en ejecutar la prueba.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import com.microsoft.sqlserver.jdbc.SQLServerResultSet;

public class CacheResultSet {

    @SuppressWarnings("serial")
    public static void main(String[] args) {

        // Create a variable for the connection string.
        String connectionUrl = "jdbc:sqlserver://<server>:<port>;encrypt=true;databaseName=AdventureWorks;user=<user>;password=<password>";

        try (Connection con = DriverManager.getConnection(connectionUrl);
                Statement stmt = con.createStatement(SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLY, SQLServerResultSet.CONCUR_READ_ONLY);) {

            String SQL = "SELECT * FROM Sales.SalesOrderDetail;";

            for (int n : new ArrayList<Integer>() {
                {
                    add(1);
                    add(10);
                    add(100);
                    add(1000);
                    add(0);
                }
            }) {
                // Perform a fetch for every nth row in the result set.
                try (ResultSet rs = stmt.executeQuery(SQL)) {
                    timerTest(n, rs);
                }
            }
        }
        // Handle any errors that may have occurred.
        catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private static void timerTest(int fetchSize,
            ResultSet rs) throws SQLException {

        // Declare the variables for tracking the row count and elapsed time.
        int rowCount = 0;
        long startTime = 0;
        long stopTime = 0;
        long runTime = 0;

        // Set the fetch size then iterate through the result set to
        // cache the data locally.
        rs.setFetchSize(fetchSize);
        startTime = System.currentTimeMillis();
        while (rs.next()) {
            rowCount++;
        }
        stopTime = System.currentTimeMillis();
        runTime = stopTime - startTime;

        // Display the results of the timer test.
        System.out.println("FETCH SIZE: " + rs.getFetchSize());
        System.out.println("ROWS PROCESSED: " + rowCount);
        System.out.println("TIME TO EXECUTE: " + runTime);
        System.out.println();
    }
}

Vea también

Trabajo con conjuntos de resultados