java servlets, mysql, singleton, bug... on va bien s'amuser !!

java servlets, mysql, singleton, bug... on va bien s'amuser !! - Java - Programmation

Marsh Posté le 17-05-2002 à 09:52:18    

je fais une appli intranet en serlvets java, j'utilise une base mysql, et j'ai une classe qui gère la connec mysql, cette classe est un singleton car je l'utilise pour synchronizer.
 
Depuis que je l'ai passée en singleton, tout les matins quand j'arrive ca me fait des 500 internal server error, je dois recompiler la classe qui s'occupde de la connec mysql pr que ca marche.
 
je suppose que ca dois venir d'un pb de limite de duree de vie de conenction a la BD ou qqch comme ca, mais je sais pas comment faire pr eviter ce pb (la classe doit a tt prix rester un singleton).
 
le code de la classe en question (je met que la partie qui concerne le pb):
 

Code :
  1. public class MySQL
  2. {
  3. private Connection jdbcConnection;
  4. private ResultSet rs;
  5. private ResourceBundle  cnxInfo = null;
  6. //la seule instance de la classe
  7. public static MySQL instance=new MySQL();
  8. //comment retourner cette instance
  9. public static MySQL getInstance()
  10. {
  11.  return instance;
  12. }
  13. //constructeur. protégé pr pas que des gens essaient de feinter et l'utiliser en plusieurs instances
  14. private MySQL ()
  15. {
  16.  //permet de prendre les paramètres du fichier dbprod.properties
  17.  cnxInfo = ResourceBundle.getBundle("dbprod" );
  18.  try
  19.  {
  20.   //connection à la base MySQL
  21.   Class.forName((String) cnxInfo.getString("driver" ) );
  22.   String connectionString = cnxInfo.getString("url" ) + "?user=" +  cnxInfo.getString("user" ) + "&password=" + cnxInfo.getString("password" );
  23.   jdbcConnection = DriverManager.getConnection(connectionString);
  24.  }
  25.  catch (SQLException connectionError)
  26.  {
  27.   System.err.println("[Test: MySQL : constructeur : SQL : " +connectionError.getMessage()+"]" );
  28.   while ((connectionError=connectionError.getNextException()) != null)
  29.   {
  30.    System.err.println("[Test: MySQL : SQL : " +connectionError.getMessage()+"]" );
  31.   }
  32.  }
  33.  catch (ClassNotFoundException e)
  34.  {
  35.   System.err.println("[Test: MySQL : CLASS : " +e.getMessage()+"]" );
  36.  }
  37. }

Reply

Marsh Posté le 17-05-2002 à 09:52:18   

Reply

Marsh Posté le 17-05-2002 à 10:10:02    

mr_mat a écrit a écrit :

Depuis que je l'ai passée en singleton, tout les matins quand j'arrive ca me fait des 500 internal server error, je dois recompiler la classe qui s'occupde de la connec mysql pr que ca marche.




 
 :heink: Je ne pense pas que c'est le fait de la recompiler qui fait que ca marche mais plutot le fait que tu la "relances". C'est à dire qu'il refait la connection etc.
 
Clair que si tu laisses une connection ouverte 24/24 il risque à un moment donné d'avoir des problèmes ...
 
Encore un truc. Ca sert a rien de faire un getInstance si ton instance est publique. Dans le design pattern du singleton l'instance doit etre privée.

 

[jfdsdjhfuetppo]--Message édité par DarkLord le 17-05-2002 à 10:10:19--[/jfdsdjhfuetppo]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 17-05-2002 à 10:27:53    

DarkLord a écrit a écrit :

 
 
 :heink: Je ne pense pas que c'est le fait de la recompiler qui fait que ca marche mais plutot le fait que tu la "relances". C'est à dire qu'il refait la connection etc.
 
Clair que si tu laisses une connection ouverte 24/24 il risque à un moment donné d'avoir des problèmes ...
 
Encore un truc. Ca sert a rien de faire un getInstance si ton instance est publique. Dans le design pattern du singleton l'instance doit etre privée.  
 
 



ok je paserai en private.
 
en fait je pense justement que le fait de recompiler+rempplacer le .class relance la connec c pr ca que ca marche.
 
ce qu'il me faudrait c'est (dans getInstance) un moyen de tester si la connec est OK, et la relancer si il le faut. mais je sais poa comment faire.

Reply

Marsh Posté le 17-05-2002 à 10:41:49    

bin déjà il faudrait que tu logs quel genre d'erreur tu as parce qu'un 500 c'est pas super explicite. Et pour ta remarque est débile.  C'est pas le fait de recompiler et de relancer qui fait que ca marche. C'est simplement le fait que tu recrées le singleton.  
 
Recompiler le meme code n'a rien à voir là dedans, c'est vraiment zarb ce que tu dis.
 
Donc catch les erreurs que tu pourrais avoir au niveau de ta connection et balance les logs.


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 17-05-2002 à 10:47:13    

DarkLord a écrit a écrit :

bin déjà il faudrait que tu logs quel genre d'erreur tu as parce qu'un 500 c'est pas super explicite. Et pour ta remarque est débile.  C'est pas le fait de recompiler et de relancer qui fait que ca marche. C'est simplement le fait que tu recrées le singleton.  
 
Recompiler le meme code n'a rien à voir là dedans, c'est vraiment zarb ce que tu dis.
 
Donc catch les erreurs que tu pourrais avoir au niveau de ta connection et balance les logs.  



je sais que c'est le fait de recréer le singleton qui fait que ca marche, c'est ce que je voulais dire (en remplacant le .class il detruit le singleton automatiquement je pense).
 
bo je vais essayer de catcher les erreur

Reply

Marsh Posté le 17-05-2002 à 10:56:25    

pr l'instant j'ai  

Code :
  1. Communication link failure: java.io.IOException


c'est tout :(
 
bon vais tenter de modifier le code pr recuperer la IOexception,

Reply

Marsh Posté le 17-05-2002 à 11:00:55    

la trace surtout avec le code qui correspond


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 17-05-2002 à 11:20:29    

ouais ben va faloir attendre que l'erreur intervienne a nouveau, lundi  :wahoo:  
 
en attendant je rajoute  

Code :
  1. if (jdbcConnection.isClosed())
  2.   {
  3.    String connectionString = cnxInfo.getString("url" ) + "?user=" +  cnxInfo.getString("user" ) + "&password=" + cnxInfo.getString("password" );
  4.    jdbcConnection = DriverManager.getConnection(connectionString);
  5.   }


dans le fonctions de query, on verra si ca peut résoudre le pb

Reply

Marsh Posté le 17-05-2002 à 13:42:50    

tu as ajouté une stack trace vers les logs au moins ?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 17-05-2002 à 13:48:03    

c'est prévu

Reply

Marsh Posté le 17-05-2002 à 13:48:03   

Reply

Marsh Posté le 05-06-2002 à 17:02:33    

Normalement, ton singleton devrait conserver un pooledConnection plutot qu'un connection.
Et au lieu d'appeler directement connection.quelquechose(), tu fais : pool.getConnection().quelquechose() ...
Le pool va s'occuper de te trouver une connection valide et donc t'en recréera une le matin !!

Reply

Marsh Posté le 05-06-2002 à 17:14:10    

Ton truc ça pue le Timeout sur la connection!
 
Si tu as les source de ton driver, va voir le code de la classe que tu obtiens sur ton driver.getconnection().

Reply

Marsh Posté le 05-06-2002 à 17:15:43    

ce topic pue le rat mort


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 05-06-2002 à 22:14:52    

DarkLord a écrit a écrit :

ce topic pue le rat mort  




... dans la série DarkLord était de mauvais poil aujourd'hui: l'épisode où ça devient trash, qu'on sent qu'au prochain épisode il va jeter son pc par la fenetre


---------------
\^o^/ Libérez HotShot \^o^/
Reply

Marsh Posté le 05-06-2002 à 23:09:12    

chapi456 a fait irruption sur le forum a écrit :

Normalement, ton singleton devrait conserver un pooledConnection plutot qu'un connection.
Et au lieu d'appeler directement connection.quelquechose(), tu fais : pool.getConnection().quelquechose() ...
Le pool va s'occuper de te trouver une connection valide et donc t'en recréera une le matin !!  




 
tin mais c'est pas possible ! encore un gars que je connais qui vient squatter ce forum ... je suis suivi ou quoi ???
 
:hello: ca va chapi ?  
il marche ton cookie :D


Message édité par benou le 06-05-2002 à 23:09:25
Reply

Marsh Posté le 06-06-2002 à 11:50:30    

non , il marche pas ...
Et pis il faut bien te suivre pour corriger toutes les conneries que tu racontes !

Reply

Marsh Posté le 06-06-2002 à 11:57:19    

sympa d'avoir deterré le topic, mais en fait j'avai trouver une solution :)
 

Code :
  1. //on relance la connection si elle est fermée (après un certain temps d'inutilisation)
  2.   if (jdbcConnection.isClosed())
  3.   {
  4.    String connectionString = cnxInfo.getString("url" ) + "?user=" +  cnxInfo.getString("user" ) + "&password=" + cnxInfo.getString("password" );
  5.    jdbcConnection = DriverManager.getConnection(connectionString);
  6.   }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed