Pool jdbc multi-schémas

Description

Les pools de base de données sont généralement mono schéma, ce qui oblige la création d'un pool pour chaque schéma utilisé dans la base de données.

Sur des environnements dynamiques (création d'utilisateur ou schémas par le programme), il est parfois utile d'utiliser un pool multi schémas, c'est ce que vous propose c'est article avec un pool écrit Java et une connexion à la base de données Oracle.

On peut modifier le source pour l'adapter à toutes bases de données JDBC.

La classe JAVA MultiSchemaDbPool prend en charge la gestion du pool JDBC comprenant l'affectation de nouvelles connexions, ainsi que le nettoyage des connexions inutiles.

Deux classes de tests sont fournies pour valider la syntaxe et la performance du pool. Dans la classe TestPool, vous devez mettre à jour les variables suivantes avec vos valeurs de connexion:

private String Hostname = "localhost";
private String SID = "xe";
private int Port = 1521;

Ce test permet d'exécuter 500 requêtes simultanées avec trois type de syntaxe Sql (modifiable dans le source). Le résultat de ce test fournit une information sur l'utilisation du pool, par exemple :

Stats : maxopen:17 - nbcnx:1498 - reject:0 - hitcount:1483

Ceci indique qu'il y eu 1498 demande de connexions pour seulement 17 connexions réelles à la base. 1483 demandes ont réutilisées une connexion déjà existante.

Il y a un thread dans la classe MultiSchemaDbPool qui prend en charge le nettoyage des connexions (déconnexion à la base) dans un temps imparti. Voir les variables cleanTime, maxSoftAge et maxHardAge.

Le nombre maximum d'entrées dans le pool (correspondant à votre licence) est indiqué par la variable maxPool.

L'appel au pool est effectué de la manière suivante :

Connection cnx = null;
PreparedStatement ps = null;
ResultSet rs = null;
try
{
cnx = dbPool.getPoolConnexion("scott", "tiger");
ps = cnx.prepareStatement(
"select dname from scott.dept join (scott.emp) using (deptno) order by 1");
rs = ps.executeQuery();
while (rs.next())
{
...
}
}
catch (Exception e)
{
System.out.println(e.toString());
}
finally
{
dpPool.freeConnection(cnx, ps, rs);
}

Notez qu'il est important de libérer la connexion après chaque requête en utilisant le modèle ci-dessus.

Ce code met en œuvre un Thread pour la partie nettoyage des connexions, et utilise la synchronisation de code pour garantir un fonctionnement correct.
L'objet Mutex peut être remplacé par Object mutex = new Object();

J'ai mis quelques commentaires (en anglais, certes mais c'est plus court)...

Je pense que ce code est modifiable pour MySql, avec une connexion sur différentes bases et non par schémas (utilisateurs) comme c'est le cas ici.

Conclusion :


Commentaires appréciés...

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.