En fait l'utilisateur doit pouvoir se d�connecter de la base en cours 
pour se reconnecter � une autre (par contre il n'est pas possible 
d'avoir deux connections simultan�es). Donc la variable "conn" ne doit 
pas �tre fig�e.

Aur�lien

Le mardi 28 mai 2002, � 02:31 , Philippe Delrieu a �crit :

> D'une mani�re g�n�rale lorsque l'on veut partager une ressource ou une 
> variable entre plusieurs instances de classes et �tre s�re que la 
> ressource ne sera initialis�e qu'une fois (c'est souvent le cas avec 
> les connexion aux bases de donn�es) il faut utiliser le pattern 
> singleton. Ce pattern garanti la cr�ation unique d'une classe et son 
> partage parmis les autres. Le mod�le dans ton cas peut �tre le suivant :
>
> public ConnectionManager     {
>    private staitc ConnectionManager    manager;
>    private Connection conn;
>
>    private ConnectionManager ()    {
>        try { Class.forName("org.gjt.mm.mysql.Driver"); }
>            catch (java.lang.ClassNotFoundException e)
>         {             System.err.println(" Erreur 
> ClassNotFoundException: ");
>          System.err.println(" " + e.getMessage());
>     }
>
>    try { conn = 
> DriverManager.getConnection("jdbc:mysql:///mabase", "", ""); }
>    catch (SQLException ex)
>     {
>      System.err.println(" Erreur SQLException:");
>      System.err.println(" " + ex.getLocalizedMessage() + "\n 
> (erreur " + ex.getErrorCode() + ")");
>     }     }
>
>    public static ConnectionManager  getManager()    {
>        if (manager == null)    {              synchronized 
> (ConnectionManager )    {
>                if (manager == null)    {
>                    manager = new ConnectionManager ();                }
>            }
>        }
>    }
>
>    public Connection getConnection()    {
>        return conn;
>    }
> }
>
> Pour le user / password tu peux utiliser des properties ou 
> pr�-initialiser la classe avec les bonnes valeurs.
>
> Pour avoir ta connexion tu utilises la ligne suiivante :
> Connection conn = ConnectionManager.getManager().getConnection();
>
> La connexion n'est cr��e qu'une seule fois et partager par toutes les 
> classes.
> Autres remarques : pour les acces aux bases de donn�es il vaut mieux 
> utiliser un gestionnaire de connexion qui cr��e et lib�re les 
> connexions d'une mani�re plus transparente.
>
> Philippe Delrieu
> Cybernomade
>
> Sebastien Cesbron wrote:
>
>> Le probl�me c'est que tu utilises conn qui n'est pas static dans des 
>> m�thodes static.
>> Tu as deux solutions pour r�soudre ton probl�me
>>
>> - tu ne mets pas ta m�thode doMySQLconnection static
>> - tu veux absolument la mettre static. Dans ce cas tu utilises une 
>> variable locale � la m�thode et tu retournes une Connection et tu 
>> l'utiliseras dans ton code en faisant conn = doMySQLconnection(...)
>>
>> Seb
>>
>> Aur�lien Mazurie wrote:
>>
>>>
>>> Grrr... Je d�sesp�re de trouver une r�ponse � un probl�me tout 
>>> simple, d� au fait que je d�bute en Java... Je suis s�r que vous 
>>> allez trouver �a simplissime:
>>> J'ai une classe principale qui contient des variables qui seront 
>>> utilis�es par toutes les classes filles appell�es (ces classes 
>>> correspondent � des formulaires, des bo�tes de dialogues, etc.). Ces 
>>> variables sont appell�es � changer (par exemple: la classe m�re 
>>> contient une variable indiquant le nombre de fen�tres ouvertes, et 
>>> chaque classe fille doit y acc�der pour pouvoir l'incr�menter ou la 
>>> d�cr�menter).
>>> Le probl�me est que le compilateur me sort toujours des choses comme 
>>> "il faut que votre variable soit d�clar�e comme statique pour �tre 
>>> appell�e". P�nible ! Je ne veux pas de variable statique...
>>>
>>> Vous avez ci-dessous un extrait de mon code: je veux "partager" la 
>>> variable conn entre toutes les classes filles appell�es � partir de 
>>> la classe m�re MainFrame (qui est elle m�me appell�e par la class 
>>> principale du programme). J'ai lu quelque part que l'on ne pouvait 
>>> pas le faire directement, donc j'ai cr�� dans la classe appelante 
>>> (MainFrame) une fonction "getConnection" qui renvoie la valeur de 
>>> conn (et "doMySQLconnection" qui la d�finie). A ce stade, pfff... 
>>> J'ai tout essay�. Si je ne d�clare pas les fonctions comme statiques, 
>>> dans les classes filles j'ai un message "A reference to an instance 
>>> of class MainFrame is required to access this non static member of 
>>> it" lorsque j'essaye de les appeller (par le biais d'un "autre_conn = 
>>> MainFrame.getConnection()")... Si je les d�clare comme statiques, 
>>> comme ci-dessous, j'ai le m�me probl�me avec la variable conn... 
>>> Snif ! Je veux bien indiquer une instance active de MainFrame, mais 
>>> comment on fait �a ?
>>>
>>>     Aur�lien Mazurie
>>>
>>> public class MainFrame extends JFrame
>>>  {
>>>   // Acces a la base MySQL
>>>   private Connection conn;
>>>
>>>   public static void doMySQLconnection (String host, String user, 
>>> String password)
>>>    {
>>>     try { Class.forName("org.gjt.mm.mysql.Driver"); }
>>>     catch (java.lang.ClassNotFoundException e)
>>>      {
>>>       System.err.println(" Erreur ClassNotFoundException: ");
>>>       System.err.println(" " + e.getMessage());
>>>      }
>>>
>>>     try { conn = 
>>> DriverManager.getConnection("jdbc:mysql:///mabase", "", ""); }
>>>     catch (SQLException ex)
>>>      {
>>>       System.err.println(" Erreur SQLException:");
>>>       System.err.println(" " + ex.getLocalizedMessage() + "\n 
>>> (erreur " + ex.getErrorCode() + ")");
>>>      }
>>>    }
>>>
>>>   public static Connection getConnection ()
>>>    {
>>>     return conn;
>>>    }
>>>
>>>  ...
>>>
>>>
>>
>>
>>
>> ______________________________________________________________________________
>> ifrance.com, l'email gratuit le plus complet de l'Internet !
>> vos emails depuis un navigateur, en POP3, sur Minitel, sur le WAP...
>> http://www.ifrance.com/_reloc/email.emailif
>>
>
>
>
>

Répondre à