Question concernant org.apache.commons.dbcp.BasicDataSource

J’ai corrigé un bug lié à la manière dont nous utilisions BasicDataSource et bien que j’en comprenne une partie, j’ai encore des questions sans réponse 🙂

Problème: L’application n’a pas pu se connecter automatiquement à la firebase database après une défaillance de la firebase database.

L’application utilise la classe org.apache.commons.dbcp.BasicDataSource en tant que pool de connexions TCP pour une connexion JDBC à la firebase database Oracle.

Correction: Après quelques recherches, j’ai découvert que dans BasicDataSource, testOnBorrow et testOnreturn n’étaient pas définis. J’ai fourni la requête de validation pour tester les connexions. Cela a résolu le problème

Max nombre de connexions dans le pool a été défini sur 1

Ma compréhension: Le pool de connexions transmettrait une connexion à l’application. Ce que je pensais, c’était que l’application MAGICALLY renvoyait la collection défectueuse au pool lorsqu’elle s’est bloquée. Maintenant que le pool ne sait pas s’il s’agit d’une mauvaise connexion, il transmettra la même connexion à l’application la prochaine fois qu’il en aura besoin, ce qui empêchera l’application de se reconnecter automatiquement à la firebase database.

Maintenant, après le correctif .. chaque fois qu’une mauvaise connexion est renvoyée au pool de connexions, elle sera supprimée et ne sera plus utilisée en raison du correctif que j’ai apporté ci-dessus.

Maintenant, je sais que BasicDataSource encapsule la connexion avant de donner à l’application, de sorte que chaque fois que l’application dit con.close ..BasicDataSource sache que la connexion n’est plus utilisée. éliminer, etc.

Question sans réponse: Cependant, ce que je ne comprends pas, c’est ce qui fait que l’application MAGICALLY retourne la connexion au pool de connexion lorsque sa connexion est rompue [Notez que la méthode con.close n’est pas appelée lorsque la connexion se termine de manière non-harmonieuse] BasicDataSource n’a aucun moyen de savoir si la connexion est fermée ou existe? Quelqu’un peut-il m’indiquer de coder pour cela?

Je comprends mieux pourquoi le correctif a fonctionné?

Maintenant, je sais que c’est un peu un vieux thread, mais il est haut sur les résultats de recherche de Google, alors j’ai pensé que je pourrais lui donner une réponse rapide. Pour plus d’informations sur la configuration de BasicDataSource, vous devez référencer la page de configuration DBCP: http://commons.apache.org/proper/commons-dbcp/configuration.html

Pour répondre à la question “non répondu” de “Comment BasicDataSource sait-il quand une connexion est abandonnée et doit être renvoyée au pool de connexions?” (paraphrasé) …

org.apache.commons.dbcp.BasicDataSource est capable de surveiller le trafic et l’utilisation des connexions qu’il offre en utilisant une classe wrapper pour la connexion. Chaque fois que vous appelez une méthode sur la connexion ou toute instruction créée à partir de la connexion, vous appelez une classe wrapper qui implémente une interface ou étend une classe de base avec ces mêmes méthodes (Hurray for Polymorphism!). Ces méthodes personnalisées permettent à la source de données de savoir si une connexion est active ou non.

Sur BasicDataSource, une propriété appelée “removeAbandoned” et une autre appelée “removeAbandonedTimeout” sont utilisées pour configurer ce comportement de renvoi des connexions non liées au pool de connexions.

“removeAbandoned” est un booléen qui indique si les connexions abandonnées doivent être renvoyées au pool. La valeur par défaut est “false”.

“removeAbandonedTimeout” est un int, qui représente le nombre de secondes d’inactivité à laisser passer avant qu’une connexion soit considérée comme abandonnée. La valeur par défaut est 300 (environ 5 minutes).

En regardant le test des connexions abandonnées , il apparaît que lorsque toutes les connexions du pool sont “utilisées” lorsqu’une nouvelle connexion est demandée, les connexions “en service” sont testées pour l’abandon (elles maintiennent un horodatage de la dernière heure utilisée) .

Voir BasicDataSource # setRemoveAbandoned (boolean) et BasicDataSource # setRemoveAbandonedTimeout (int)

Quelle que soit l’intelligence ou non de votre pool de connexions en ce qui concerne la fermeture des connexions abandonnées, vous devez toujours vous assurer que chaque connexion est fermée dans un bloc finally, par exemple:

Connection conn = getConnection(); try { ... // perform work } finally { conn.close(); } 

Ou utilisez d’autres moyens tels qu’Apache DBUtils .