Esta aplicación de ejemplo del Controlador Microsoft JDBC para SQL Server muestra cómo recuperar un conjunto de resultados grande de una base de datos y, a continuación, cómo controlar el número de filas de datos almacenadas en la memoria caché del cliente con el método setFetchSize del objeto SQLServerResultSet.
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, heredado por los objetos SQLServerPreparedStatement y SQLServerCallableStatement.
Para establecer el límite del número de filas almacenadas en la memoria caché del cliente, primero debe usar un cursor de servidor para crear uno de los objetos Statement mediante la especificación del tipo de cursor que se va a usar al crear el objeto Statement. Por ejemplo, el controlador JDBC 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.
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 contenida en el objeto Statement y devueltos los datos al cliente como un conjunto de resultados, puede llamar al método 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 establece el tamaño de captura en 10, solo se almacenan en la memoria caché del cliente 10 filas de datos en un momento dado. Aunque esto reduce la velocidad del procesamiento de datos, ofrece la ventaja de usar menos memoria en el cliente, lo que puede resultar especialmente útil si necesita procesar grandes cantidades de datos.
El archivo de código para este ejemplo se llama cacheRS.java y se encuentra en la siguiente ubicación:
<directorio de instalación>\sqljdbc_<version>\<language>\help\samples\resultsets
Requisitos
Para ejecutar esta aplicación de ejemplo, debe configurar la ruta de clase para que incluya el archivo sqljdbc.jar o el archivo sqljdbc4.jar. Si en la ruta de clase falta una entrada para sqljdbc.jar o sqljdbc4.jar, la aplicación de ejemplo genera la excepción común "Clase no encontrada". Además, debe tener acceso a la base de datos de ejemplo SQL Server 2005 AdventureWorks. Para obtener más información acerca de cómo establecer la ruta de clase (classpath), vea Usar el controlador JDBC.
El Controlador Microsoft JDBC para SQL Server proporciona los archivos de biblioteca de clases sqljdbc.jar y sqljdbc4.jar que hay que usar dependiendo de su configuración preferida de Java Runtime Environment (JRE). Para obtener más información acerca del archivo JAR que hay que elegir, vea Requisitos del sistema para el controlador JDBC.
Ejemplo
En el siguiente ejemplo, el código muestra realiza una conexión a la base de datos de ejemplo AdventureWorks. A continuación, usa una instrucción SQL con el objeto SQLServerStatement, especifica el tipo de cursor de servidor y, a continuación, ejecuta la instrucción SQL y coloca los datos que devuelve en un objeto SQLServerResultSet.
Después, el código muestra 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, a continuación, procesa una iteración en 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, a continuación, muestra el resultado de dicha prueba incluidos el tamaño de recuperación, el número de filas procesadas y el tiempo que se tardó en ejecutar la prueba.
import java.sql.*; import com.microsoft.sqlserver.jdbc.SQLServerResultSet; public class cacheRS { public static void main(String[] args) { // Create a variable for the connection string. String connectionUrl = "jdbc:sqlserver://localhost:1433;" + "databaseName=AdventureWorks;integratedSecurity=true;"; // Declare the JDBC objects. Connection con = null; Statement stmt = null; ResultSet rs = null; try { // Establish the connection. Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); con = DriverManager.getConnection(connectionUrl); // Create and execute an SQL statement that returns a large // set of data and then display it. String SQL = "SELECT * FROM Sales.SalesOrderDetail;"; stmt = con.createStatement(SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLY, + SQLServerResultSet.CONCUR_READ_ONLY); // Perform a fetch for every row in the result set. rs = stmt.executeQuery(SQL); timerTest(1, rs); rs.close(); // Perform a fetch for every tenth row in the result set. rs = stmt.executeQuery(SQL); timerTest(10, rs); rs.close(); // Perform a fetch for every 100th row in the result set. rs = stmt.executeQuery(SQL); timerTest(100, rs); rs.close(); // Perform a fetch for every 1000th row in the result set. rs = stmt.executeQuery(SQL); timerTest(1000, rs); rs.close(); // Perform a fetch for every 128th row (the default) in the result set. rs = stmt.executeQuery(SQL); timerTest(0, rs); rs.close(); } // Handle any errors that may have occurred. catch (Exception e) { e.printStackTrace(); } finally { if (rs != null) try { rs.close(); } catch(Exception e) {} if (stmt != null) try { stmt.close(); } catch(Exception e) {} if (con != null) try { con.close(); } catch(Exception e) {} } } private static void timerTest(int fetchSize, ResultSet rs) { try { // 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(); } catch (Exception e) { e.printStackTrace(); } } }