Voil� un Objet qui simule un pool de connexions.
Ici, on en cr�e 5, et puis on les r�serve ou on les lib�re selon les besoins.
C'est tout simple.
import java.util.*;
import java.io.*;
import java.sql.*;
public class PoolCx
{
private static Vector cxLibres;
private static Vector cxPrises;
private static final String driverClass = "oracle.jdbc.driver.OracleDriver";
private static String
dbName = "jdbc:oracle:thin:@10.100.4.101:1521:ORCL,
login = "scott",
password = "tiger";
private static int NB_CONNEXIONS = 5;
private static void initialisation()
{
try
{
cxLibres = new Vector();
cxPrises = new Vector();
Class.forName(driverClass);
// Pre-create NB_CONNEXIONS connexions in this pool
for(int i=0;i<NB_CONNEXIONS;i++)
{
Connection cx = DriverManager.getConnection (dbName, login, password);
cxLibres.addElement(cx);
}
System.out.println("Pool de "+NB_CONNEXIONS+" connexions cree sur l'instance Oracle "+login);
}
catch(Exception ex)
{
System.out.println("Probleme d'acces a la base de donnees:");
ex.printStackTrace();
}
}
public static void init(String url, String l, String pwd, int nbConn)
{
dbName = url;
login = l;
password = pwd;
NB_CONNEXIONS = nbConn;
initialisation();
}
private static synchronized Connection tryReserveCx()
{
Connection cx = null;
if (cxLibres.size()>0)
{
cx = (Connection) cxLibres.elementAt(0);
cxLibres.removeElementAt(0);
cxPrises.addElement(cx);
}
return cx;
}
/** R�serve une connexion pour son utilisation.
* La tentative de r�servation est faite 5 fois, toute les secondes, suite � quoi
* la connection n'est pas fournie.
* @return La connexion demand�e, ou null si pas possible.
*/
public static Connection reserveCx()
{
Connection cx = null;
for(int i=0;(i<5) && (cx==null) ;i++)
{
cx = tryReserveCx();
if (cx==null)
{
try
{
Thread.currentThread().sleep(1000);
}
catch(Exception e)
{
}
}
}
return cx;
}
/** Lib�re une connexion utilis�e.
* La connexion est dispo pour un autre utilisateur.
* @param cx La connexion � lib�rer.
*/
public static void libereCx(Connection cx)
{
cxPrises.removeElement(cx);
cxLibres.addElement(cx);
}
protected void finalize()
{
System.out.println("PoolCx is garbage-collected.");
toutLiberer();
}
protected static void toutLiberer()
{
System.out.println("Liberation de toutes les connexions de PoolCx");
try
{
for (Enumeration e = cxLibres.elements(); e.hasMoreElements();)
{
((Connection)e.nextElement()).close();
}
for (Enumeration e = cxPrises.elements(); e.hasMoreElements();)
{
((Connection)e.nextElement()).close();
}
}
catch (SQLException e)
{
System.out.println("Erreur a la lib�ration des connexions:");
e.printStackTrace();
}
}
}
-----Message d'origine-----
De : Jean Michel Flambard [mailto:[EMAIL PROTECTED]]
Envoy� : lundi 15 avril 2002 14:01
� : [EMAIL PROTECTED]
Objet : Re: javax.naming.Context
Merci Manu et � J�rome Moli�re aussi,
en fait ce que je ne comprenais pas c'est que le pool etait dans un annuaire LDAP.
Je n'ai jamais utilis� d'annuaire et je ne savais pas bien (pas du tout) ce que c'�tait
avant d'y �tre confront�.
Maintenant je n'ai plus qu'a potasser la doc du JNDI pour comprendre un peu mieux.
Pour le pool de connexions je savais un peu mieux ce que c'�tait. Mais est-ce que
que tous les moteurs de servlets l'impl�mentent de la m�me fa�on ?
Je d�veloppe mon application sur Resin, mais est ce que la m�me application tournera
sous Tomcat ou Websph�re par exemple sans modifications ?
Sinon, comment configurer Resin pour pouvoir utiliser DriverManager et Class.forName()
ou mon propre pool de connexions ?
Meci,
Jean Michel Flambard
