seblm2 | Salut Sylvain38220,
Tu ne décris pas très bien ton problème mais en regardant ton code on peut essayer de deviner pourquoi tu n'arrives pas à l'expliquer. Le principal problème de ta classe est que tu absorbes les exceptions qui pourtant pourraient te donner pas mal d'informations sur la cause du dysfonctionnement. Au lieu de faire :
Code :
- try {
- String DBurl = "jdbc:postgresql://postgres-info/bdbaret";
- connection_base = DriverManager.getConnection(DBurl, "userbaret", "******" );
- } catch (Exception e) {
- arret("Connection à la base de données impossible" );
- }
|
Je te suggères plutôt de faire :
Code :
- String DBurl = "jdbc:postgresql://postgres-info/bdbaret";
- try {
- connection_base = DriverManager.getConnection(DBurl, "userbaret", "******" );
- } catch (SQLException e) {
- System.err.println("Connexion à la base de données impossible" );
- throw e;
- }
|
Si DriverManager lance une exception SQLException elle doit contenir au moins un message d'erreur qui pourrait te permettre de diagnostiquer le souci. Tu peux très bien afficher le message d'erreur de ton choix sur la sortie d'erreur mais il faut absolument re-throw l'exception afin que l'appelant en sache davantage.
Je vois pas mal d'autres problèmes dans ton code. Par exemple :
- le membre table_questions est static : il n'a aucune raison de l'être et c'est même plutôt dangereux si on instance deux fois ta classe
- le membre dbmd est instancié dans le constructeur mais tu ne l'utilises jamais : tu peux supprimer cette déclaration
- la méthode statique affiche() est un renommage de System.out.println() (elle ne fait que ça) : le plus simple est de supprimer cette méthode et de remplacer chacun de ses appels par System.out.println(). En terme de refactoring on appelle cela l'inlining
- ne jamais appeler System.exit() : on ne termine jamais un processus violemment comme ça (surtout vu ce que tu fais des connexions ouvertes vers ta base - j'en reparle plus bas).
- une fois que tu as récupéré les données de chacune des lignes de ta requête tu ne nettoies rien : tu restes connecté à la base de données et ton ResultSet reste navigable. Si ta classe est instanciée très souvent, elle va finir par épuiser le stock de thread de connexions que ta base a alloué et finalement le programme Java va être bloqué. Pour clôturer proprement les ressources JDBC, il faut utiliser le mot clé finally de Java. Regarde ma proposition de solution plus bas pour voir comment ça peut fonctionner.
- le mot de passe d'accès à ta base de données en clair dans le forum ce n'est pas très prudent : je te suggère de le supprimer dans ton post.
Si on se détache un peu de ton code : pour que les gens aient envie de t'aider, il faut que tu leur donnes plus d'informations sur l'erreur que tu rencontres. Le schéma de ta base de données aurait été un plus pour débugger. Par exemple voici le schéma que j'ai utilisé pour faire fonctionner ta classe :
Code :
- create table Question (Intitulé_Question varchar, Thème varchar, Bonne_Réponse integer, Réponse_1 varchar, Réponse_2 varchar, Réponse_3 varchar, Réponse_4 varchar);
- insert into Question values ('Quel président sera élu en 2012 ?', 'Politique', 4, 'Nicolas Sarkozy', 'François Hollande', 'Marine Le Pen', 'Obiwan Kenobi');
|
Proposition de solution :
|