2017-02-11 1 views
1

J'utilise C3P0NativeJdbcExtractor pour extraire la connexion JDBC native comme ci-dessous.Connection.close() sur C3P0NativeJdbcExtractor ferme la connexion et la supprime du pool

public Connection getNativeConnection() throws SQLException{ 
     C3P0NativeJdbcExtractor nativeJbdc; 
     nativeJbdc = new C3P0NativeJdbcExtractor(); 
     return nativeJbdc.getNativeConnection(dataSource.getConnection()); 
    } 

Notez que la source de données ici est obtenue d'un pool de connexions C3P0. Lorsque je fais un Connection.close() retourné sur cette méthode, il ferme réellement la connexion au lieu de retourner au pool. Toutefois, si nous fermons la connexion non dépliée, elle est renvoyée au pool.

Y a-t-il une raison pour laquelle la fermeture de la connexion enveloppée échoue à renvoyer la connexion au pool?

+0

Je pense que votre question confond la signification de _wrapped_ et _unwrapped_, car vous semblez utiliser wrapped pour la connexion extraite et déballé pour la connexion obtenue à partir du pool. –

Répondre

2

Un pool de connexions comme c3p0 contient une collection de connexions physiques ('natives') créées par un pilote JDBC. Lorsque vous lui demandez une connexion, elle enveloppe cette connexion physique dans un proxy, également appelé connexion logique.

Ce proxy intercepte certaines méthodes telles que Connection.close(). Pour close() au lieu de fermer la connexion, il invalide la connexion logique afin qu'il se comporte comme une connexion fermée et renvoie la connexion physique au pool de connexions. Votre code extrait la connexion physique de la connexion logique et la retourne à la place. Si vous appelez close(), vous fermez la connexion à la base de données au lieu de la renvoyer au pool.

Vous ne devriez presque jamais avoir de raison d'extraire la connexion native comme ça. La seule raison est lorsque vous avez besoin d'accéder à des fonctionnalités spécifiques au pilote. Vous devriez essayer d'utiliser JDBC standard autant que possible, et seulement déballer pour accéder aux fonctionnalités spécifiques au pilote lorsque vous en avez vraiment besoin.

Lorsque vous appelez close(), veillez à appeler close() sur la connexion logique que vous avez reçue du pool de connexions, pas sur la connexion physique déballée.

+0

C'est ce que je cherchais, merci pour l'aide. Nous utilisons JDBC standard pour des raisons inconnues, la connexion native a été utilisée pour effectuer des appels de paquets. Au cours de laquelle nous récupérons la connexion en utilisant nativeC3P0Extractor à partir de la source de données. – MADDY987

+0

@ MADDY987 Si ma réponse vous a aidé à résoudre le problème, veuillez envisager d'accepter ma réponse, voir aussi http://stackoverflow.com/help/someone-answers –