Share via


Usar el almacenamiento en búfer adaptable

El almacenamiento en búfer adaptable es una característica nueva del controlador JDBC de Microsoft SQL Server 2005 versión 1.2, que se ha diseñado para recuperar cualquier tipo de datos de valores grandes sin sufrir la sobrecarga de los cursores de servidor.

Normalmente, cuando el controlador JDBC de Microsoft SQL Server 2005 ejecuta una consulta, recupera todos los resultados del servidor en la memoria de la aplicación. Aunque este enfoque reduce el uso de recursos en SQL Server, puede iniciar una OutOfMemoryError en la aplicación JDBC para las consultas que producen resultados muy grandes.

Para permitir que las aplicaciones administren los resultados muy grandes, el controlador JDBD de Microsoft SQL Server 2005 versión 1.2 proporciona el almacenamiento en búfer adaptable. Puede que un desarrollador de aplicaciones prefiera usar el almacenamiento en búfer adaptable con una instrucción por las razones siguientes:

  • La consulta genera un conjunto de resultados muy grande: la aplicación puede ejecutar una instrucción SELECT que genera más filas de las que la aplicación puede almacenar en memoria. En las versiones anteriores, la aplicación tenía que utilizar un cursor de servidor para evitar un OutOfMemoryError. En la versión 1.2, la aplicación puede utilizar en su lugar el almacenamiento en búfer adaptable. El almacenamiento en búfer adaptable permite hacer un paso de sólo lectura y sólo avance de un conjunto de resultados arbitrariamente grande sin requerir un cursor de servidor.

  • La consulta genera columnas de SQLServerResultSet muy grandes o valores de parámetros SQLServerCallableStatement OUT: la aplicación puede recuperar un valor único (columna o el parámetro OUT) que es demasiado grande como para que quepa completamente en la memoria de la aplicación. El almacenamiento en búfer adaptable permite a la aplicación cliente recuperar este valor como una secuencia, utilizando los métodos getAsciiStream, getBinaryStream, o getCharacterStream. La aplicación recupera el valor de SQL Server cuando lee de la secuencia.

Establecer el almacenamiento en búfer adaptable

Hay tres formas en las que una aplicación puede solicitar que la ejecución de una instrucción deba usar el almacenamiento en búfer adaptable:

Cuando se leen valores grandes una vez con los métodos get<Type>Stream y se tiene acceso a las columnas ResultSet y a los parámetros OUT CallableStatement en el orden que devuelve SQL Server, el almacenamiento en búfer adaptable reduce la utilización de memoria de la aplicación al procesar los resultados. Al utilizar el almacenamiento en búfer adaptable:

  • Los métodos get<Type>Stream definidos en las clases SQLServerResultSet y SQLServerCallableStatement devuelven secuencias de una sola lectura de forma predeterminada, aunque se pueden restablecer las secuencias si lo determina la aplicación. Si la aplicación desea reset la secuencia, tiene que llamar primero al método mark en esa secuencia.

  • Los métodos get<Type>Stream definidos en las clases SQLServerClob y SQLServerBlob devuelven secuencias cuya posición siempre se puede cambiar a la inicial de la secuencia sin llamar al método mark.

Cuando la aplicación utiliza el almacenamiento en búfer adaptable, los valores recuperados por los métodos get<Type>Stream sólo se pueden recuperar una vez. Si intenta llamar a cualquier método get<Type> en la misma columna o parámetro después de llamar al método get<Type>Stream del mismo objeto, se inicia una excepción con un mensaje similar a "Se obtuvo acceso a los datos y éstos no están disponibles para esta columna o parámetro".

Reducir el uso de la memoria de la aplicación

Los programadores deberían seguir estas instrucciones importantes para disminuir la utilización de memoria por parte de la aplicación:

  • Evite utilizar la propiedad de cadena de conexión selectMethod=cursor para permitir a la aplicación procesar un conjunto de resultados muy grande. La característica de almacenamiento en búfer adaptable del controlador JDBC de Microsoft SQL Server 2005 versión 1.2 permite a las aplicaciones procesar los conjuntos de resultados de sólo avance y sólo lectura muy grandes sin utilizar un cursor de servidor.

  • Lea los valores grandes de texto o binarios como secuencias mediante los métodos getAsciiStream, getBinaryStream, o getCharacterStream en lugar de los métodos getBlob o getClob. En la versión 1.2, la clase SQLServerCallableStatement proporciona métodos nuevos get<Type>Stream para este propósito.

  • Asegúrese de que las columnas con valores potencialmente grandes se colocan en último lugar en la lista de columnas en una instrucción SELECT y de que se usan los métodos get<Type>Stream de SQLServerResultSet para tener acceso a las columnas en el orden en que se seleccionan.

  • Asegúrese de que los parámetros OUT con valores potencialmente grandes se declaran en último lugar en la lista de parámetros del código SQL que se usa para crea la SQLServerCallableStatement. Además, compruebe que se usan los métodos get<Type>Stream de SQLServerCallableStatement para tener acceso a los parámetros OUT en el orden en que se declaran.

  • Evite ejecutar simultáneamente más de una instrucción en la misma conexión. Ejecutar otra instrucción antes de procesar los resultados de la anterior puede provocar que los resultados sin procesar se almacenen en el búfer en la memoria de la aplicación.

Vea también

Otros recursos

Mejorar el rendimiento y la confiabilidad con el controlador JDBC