Title: RE: javax.naming.Context

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

Répondre à