Entradas con la etiqueta ‘SQL Server’

Trabajar con juegos de resultados de gran tamaño.

Jueves, 26 de febrero de 2009

Adaptive response buffering es una nueva funcionalidad de la versión 1.2 driver JDBC de Sql Server que permite reducir el uso de memoria y los retrasos en la ejecución de consultas que devuelven un conjunto de resultados grande.

Mediante este método, el controlador JDBC obtiene los resultados de la consulta a la base de datos según se van necesitando, en lugar de todos de una vez. Además, el controlador JDBC elimina automaticamente de la memoria los resultados que dejan de ser accesibles por la aplicación.

Imaginemos que tenemos que hacer una consulta que devuelve una columna con un campo LOB de 600MB.  Seria inviable mantener un buffer para acceder mediante los métodos definids en la interfaz de los tipos Blob/Lob ya que estos métodos necesitan que el campo al completo este cargado en memoria. En su lugar, podemos acceder mediante un ImputStream obtenido usando los metodos getBinaryStream, getCharacterStream, o getAsciiStream del ResultSet. De esta forma, solo se necesita una cantidad de memoria pequeña y de un tamaño fijo para poder leer ese campo.

Hay varias formas para indicar al controlador JDBC que use Adaptative Response Buffering:

  • Añadir “responseBuffering=adaptive” a la URL de conexión
     Connection connection = null;
    try {
        String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
        String url = "jdbc:sqlserver://localhost:1433;database=BBDD;responseBuffering=adaptive";
        String username = "usuario";
        String password = "clave";
     
        // Cargar el Driver
        Class.forName(driverName);
     
        // Crear la conexion
        connection = DriverManager.getConnection(url, username, password);
    } catch (ClassNotFoundException e) {
        // No se ha encontrado el driver.
        e.printStackTrace();
    } catch (SQLException e) {
        // No se ha podido conectar con la base de datos
        e.printStackTrace();
    }
  • Usar el método SQLServerDataSource.setResponseBuffering(“adaptive”) del DataSource

Si nuestra aplicación siempre accede de manera consecutiva  a las filas de nuestro ResultSet y no necesita acceder a el de manera aleatoria (es decir, recorremos el juego de resultados una única vez y de pricipio a fin), podemos usar el siguiente código para indicar al controlador que descarte las filas por las que ya se han pasado:

ps = con.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY );

Etiquetas: , , , , , ,