Características de ResultSet

Este tema trata de las características de los ResultSets, como son los tipos de ResultSet, la concurrencia, la capacidad para cerrar el ResultSet comprometiendo el objeto conexión, y la especificación de las características de ResultSet.

Por defecto, el tipo de todos los ResultSets creados es solo de reenvío, la concurrencia es solo de lectura y los cursores se retienen en los límites del compromiso. Una excepción de ello la presenta WebSphere, que actualmente cambia el valor predeterminado de la capacidad de retención de cursores para que los cursores se cierren implícitamente al comprometerse. Estas características pueden configurarse mediante los métodos accesibles en objetos Statement, PreparedStatement y CallableStatement.

Tipos de ResultSet

El tipo de un ResultSet especifica los siguiente acerca del ResultSet:

Las definiciones de estos tipos de ResultSet son las siguientes:

TYPE_FORWARD_ONLY
Un cursor que solo puede utilizarse para procesar desde el principio de un ResultSet hasta el final del mismo. Este es el tipo por omisión.
TYPE_SCROLL_INSENSITIVE
Un cursor que se puede emplear para desplazares a través de un ResultSet. Este tipo de cursor es insensible a los cambios efectuados en la base de datos mientras está abierto. Contiene filas que satisfacen la consulta cuando esta se procesa o cuando se extraen datos.
TYPE_SCROLL_SENSITIVE
Un cursor que puede utilizarse para el desplazamiento en diversas formas a través de un ResultSet. Este tipo de cursor es sensible a los cambios efectuados en la base de datos mientras está abierto. Los cambios en la base de datos tienen un impacto directo sobre los datos del ResultSet.

Los ResultSets de JDBC 1.0 son siempre solo hacia adelante. Los cursores desplazables se añadieron en JDBC 2.0.

Nota: las propiedades de agrupación por bloques habilitada y de conexión de tamaño de bloque afectan al grado de sensibilidad de un cursor TYPE_SCROLL_SENSITIVE. La agrupación por bloques mejora el rendimiento al almacenar en caché datos de la propia capa del controlador JDBC.

Concurrencia

La concurrencia determina si el ResultSet puede actualizarse. Los tipos se definen de nuevo mediante constantes de la interfaz ResultSet. Los valores de concurrencia disponibles son los siguientes:

CONCUR_READ_ONLY
Un ResultSet que solo puede utilizarse para leer datos de la base de datos. Este es el valor predeterminado.
CONCUR_UPDATEABLE
Un ResultSet que permite efectuar cambios en el mismo. Estos cambios pueden colocarse en la base de datos subyacente.

Los ResultSets de JDBC 1.0 son siempre solo hacia adelante. Los ResultSets actualizables se añadieron en JDBC 2.0.

Nota: Según la especificación JDBC, el controlador JDBC puede cambiar el tipo de ResultSet del valor de concurrencia de ResultSet si los valores no pueden utilizarse conjuntamente. En tales casos, el controlador JDBC sitúa un aviso en el objeto Connection.

Existe una situación en la que la aplicación especifica un ResultSet TYPE_SCROLL_INSENSITIVE, CONCUR_UPDATEABLE. La insensibilidad se implementa en el motor de bases de datos efectuando una copia de los datos. A continuación, no se permite al usuario realizar actualizaciones mediante esa copia en la base de datos subyacente. Si especifica esta combinación, el controlador cambia la sensibilidad a TYPE_SCROLL_SENSITIVE y crea el aviso, que indica que la petición se ha cambiado.

Capacidad de retención

La característica de capacidad de retención determina si la llamada al compromiso en el objeto Connection cierra el ResultSet. La API de JDBC destinada a trabajar con la característica de capacidad de retención es nueva en la versión 3.0. Sin embargo, el controlador JDBC nativo ha proporcionado una propiedad de conexión para varios releases que le permite especificar ese valor predeterminado para todos los ResultSets creados bajo la conexión. El soporte de API altera temporalmente cualquier valor de la propiedad de conexión. Los valores de la característica de capacidad de retención se definen mediante constantes de ResultSet y son los siguientes:

HOLD_CURSOR_OVER_COMMIT
Todos los cursores abiertos permanecen así cuando se llama a la cláusula commit. Este es el valor predeterminado del controlador JDBC nativo.
CLOSE_CURSORS_ON_COMMIT
Todos los cursores abiertos se cierran cuando se llama a la cláusula commit.
Nota: Al llamar a la retrotracción en una conexión, siempre se cierran todos los cursores abiertos. Este es un hecho poco conocido, pero es una forma común de que las bases de datos manejen los cursores.

Según la especificación JDBC, el valor predeterminado de la capacidad de retención está definida por la implementación. Algunas plataformas optan por utilizar CLOSE_CURSORS_ON_COMMIT como valor predeterminado. Esto no representa generalmente un problema para la mayoría de las aplicaciones, pero el usuario debe estar al corriente de lo que realiza el controlador que utiliza si está trabajando con cursores en los límites del compromiso. El controlador JDBC de IBM® Toolbox para Java también utiliza el valor predeterminado de HOLD_CURSORS_ON_COMMIT, pero el controlador JDBC de UDB para Windows NT tiene el valor predeterminado CLOSE_CURSORS_ON_COMMIT.

Especificar características de ResultSet

Las características de un ResultSet no cambian una vez que se ha creado el objeto ResultSet. Por tanto, las características se han especificado antes de crear el objeto. Puede especificar estas características mediante variantes cargadas a posteriori de los métodos createStatement, prepareStatement y prepareCall.

Nota: Existen métodos de ResultSet para obtener el tipo de ResultSet y la concurrencia del ResultSet, pero no existe ningún método para obtener la capacidad de retención del ResultSet.