Pool jdbc multi-schémas

Soyez le premier à donner votre avis sur cette source.

Vue 4 315 fois - Téléchargée 548 fois

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

Ajouter un commentaire

Commentaires

Messages postés
2
Date d'inscription
jeudi 6 novembre 2008
Statut
Membre
Dernière intervention
5 juillet 2010

DMULLER,
Effectivement le module proposé n'est pas le seul moyen d'utiliser un pool multi-bases, multi-schémas.

Pour info, le module proposé est en production depuis plus de 2 ans.
Celui-ci est est mis à disposition à but de solution complète ou seulement didactique pour l'étude de mise en œuvre de code synchronisés et d'utilisation de threads.

Xanata
Messages postés
6
Date d'inscription
vendredi 19 août 2005
Statut
Membre
Dernière intervention
10 juin 2011

Bonjour à tous,
Aussi bien écrit soit-il, je crains toujours avoir recours à ce genre d'utilitaire.
En effet, c'est un problème système et à mon avis, la solution doit rester dans le périmètre de la config système.

Voici une solution que je préfère : vous créez une base de données possédant des databases link sur d'autres sources de données. Le pool de connexion sera bien multi-bases.
De plus, il sera totalement paramétrable au travers des consoles d'administration des serveurs web et de bases de données.
DM.

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.