Se si presuppone un (base) DataSource
(ovvero: uno che non esegue il pool di connessioni), si ottiene una connessione fisica uguale a quella ottenuta da DriverManager
(alcuni i driver utilizzano internamente DriverManager da DataSource o DataSource da DriverManager). Quindi quelle connessioni si comportano in modo identico.
Ora se assumiamo un DataSource
che fornisce il pool di connessioni, quindi il DataSource si utilizza un ConnectionPoolDataSource
(o un meccanismo interno simile) per ottenere un PooledConnection
. PooledConnection gestisce la connessione fisica effettiva al database.
Quando un utente richiede una connessione da DataSource, DataSource eseguirà il checkout di PooledConnection e chiederà uno Connection
. PooledConnection creerà quindi una connessione logica che utilizza o avvolge la connessione fisica (ad esempio utilizzando un proxy). DataSource restituirà tale connessione logica all'utente.
Per l'utente la connessione logica deve comportarsi in modo identico a una connessione fisica in tutti gli aspetti. Pertanto, quando un utente chiude la connessione, quella connessione logica e tutti gli oggetti JDBC dipendenti verranno chiusi e si comportano in modo identico a una chiusura fisica.
JDBC 4.1 sezione 11.1 dice:
Il pool di connessioni è completamente trasparente per il cliente: un client ottiene un pool collegamento e lo utilizza allo stesso modo si ottiene e utilizza una connessione non in pool.
e la sezione 11.4:
Se l'applicazione tenta di riutilizzare il manico logica, l'attuazione di collegamento tiri uno SQLException.
e
Per un determinato oggetto PooledConnection, solo l'oggetto di collegamento logico di recente ha prodotto sarà valido. Qualsiasi oggetto Connection precedentemente esistente viene automaticamente chiuso quando viene chiamato il metodo PooledConnection.getConnection associato.
Nei precedenti tuttavia, quando la connessione logica è chiuso, l'PooledConnection segnalerà il DataSource che è disponibile per il riutilizzo, e il DataSource poi restituirlo al pool di connessioni, o chiudere il PooledConnection (che chiude la connessione fisica) se non ha più bisogno della connessione.
DataSource può anche forzatamente revocare una connessione da un utente (ad esempio quando una connessione viene controllata troppo a lungo, ecc.), Chiedendo a PooledConnection di chiudere la connessione logica.
Nella mia applicazione, sono in grado di accedere al mio oggetto 'ResultSet' anche dopo aver chiuso il mio oggetto' Connection'. Quindi, secondo te, Websphere ha fallito questa implementazione? – Sriram
Dipende da cosa intendi con accesso. L'oggetto ResultSet continuerà a esistere, ma non si dovrebbe essere in grado di utilizzare il ResultSet come avrebbe dovuto essere chiuso al momento della chiusura della connessione logica. –
E se si tratta di un'implementazione errata di WebSphere: dipende da cosa si utilizza come 'ConnectionPoolDataSource' per' DataSource' di websphere. Il comportamento che ho descritto dovrebbe essere applicato dall'implementazione di 'PooledConnection'. –