Si asumimos un (básico) DataSource
(es decir: uno que no hace la agrupación de conexiones), entonces obtiene una conexión física que es la misma que la obtenida de DriverManager
(algunos los controladores incluso usan internamente DriverManager de DataSource, o DataSource de DriverManager). Entonces esas conexiones se comportarán de manera idéntica.
Ahora, si suponemos un DataSource
que proporciona la agrupación de conexiones, el DataSource usa un ConnectionPoolDataSource
(o un mecanismo interno similar) para obtener un PooledConnection
. Este PooledConnection administra la conexión física real a la base de datos.
Cuando un usuario solicita una conexión de DataSource, DataSource obtendrá una conexión compartida y le pedirá un Connection
. El PooledConnection luego creará una conexión lógica que usa o envuelve la conexión física (por ejemplo, usando un Proxy). El DataSource devolverá esa conexión lógica al usuario.
Para el usuario, la conexión lógica debe comportarse de forma idéntica a una conexión física en todos los aspectos. Por lo tanto, cuando un usuario cierra la conexión, esa conexión lógica y todos los objetos JDBC dependientes se cerrarán y se comportarán de forma idéntica a un cierre de conexión física.
JDBC 4.1 apartado 11.1 dice:
La agrupación de conexiones es completamente transparente para el cliente: El cliente obtiene una conexión agrupada y lo utiliza de la misma forma en que se obtiene y utiliza una conexión no agrupada.
Y la sección 11.4:
Si la aplicación intenta volver a utilizar el mango lógica, la aplicación de conexión lanza una excepción de SQL.
y
Para un objeto PooledConnection dado, sólo el objeto de conexión lógico producido más recientemente será válida. Cualquier objeto de conexión previamente existente se cierra automáticamente cuando se llama al método PooledConnection.getConnection asociado.
En el fondo, sin embargo, cuando la conexión lógica se cierra, el PooledConnection señalará el origen de datos que está disponible para su reutilización, y la fuente de datos será entonces volver a la agrupación de conexiones, o cerrar la PooledConnection (que cierra la conexión física) si ya no necesita la conexión.
El DataSource también puede revocar forzosamente una conexión de un usuario (por ejemplo, cuando una conexión se retira demasiado tiempo, etc.), solicitando a PooledConnection que cierre la conexión lógica.
En mi aplicación, puedo acceder a mi objeto 'ResultSet' incluso después de cerrar mi objeto' Conexión'. Entonces, según su nota, ¿Websphere falló esta implementación? – Sriram
Eso depende de lo que quiera decir con acceso. El objeto ResultSet seguirá existiendo, pero no podrá usar el ResultSet ya que debería haberse cerrado cuando se cerró la conexión lógica. –
Y si se trata de una implementación incorrecta de WebSphere: eso depende de lo que use como 'ConnectionPoolDataSource' para' DataSource' de websphere. El comportamiento que describí debe ser aplicado por la implementación 'PooledConnection'. –