Bonjour,
j'ai un problème avec la méthode getConnexion de la classe DriverManager. Mon programme comprend deux threads qui exécutent chacun une méthode synchronized différente toutes les secondes. Dans chacune des méthodes il y a un appel à getConnexion. La base est volontairement inaccessible puisque je souhaite effectuer un traitetement particulier en mode déconnecté.
Le problème c'est qu'au bout d'un certain nombres d'éxécutions la méthode getConnexion se bloque (plus d'exception SQLException levée). J'ai lu qu'il fallait pour utiliser une même connexion en multithread passer par des méthodes synchronized ce que je pense avoir fait donc je chercher toujours mon erreur. Merci de pour vos lumières !
J'utilise le driver com.mysql.jdbc.Driver et le connector myslql 5.1.7 (j'ai essayé avec le 5.1.6 sans succès).
Voici mes deux threads :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 public class SurvProductionFichier extends Thread{ private SurvMetier monSurvMetier; public SurvProductionFichier(SurvMetier lInterface) { monSurvMetier = lInterface; } public void run() { Random rnd; int tempo = 0; while(Thread.currentThread().isInterrupted() == false) { //Je lance la surveillance des fichiers monSurvMetier.traiterFichierProduit(); try { //TEST tempo = 0; //NON TEST //On endors le thread pendant un temps aléatoire entre 1 et 30 secondes //rnd = new Random(); //tempo = rnd.nextInt(29); sleep((tempo+1)*1000); } catch(InterruptedException e) { GestionLoggerProductionFichier.getLogger().log(Level.WARNING,"Thread SurvProjet interrompu dans son sommeil",e); Thread.currentThread().interrupt(); } } GestionLoggerProductionFichier.getLogger().log(Level.INFO,"Thread SurvProjet arrete"); } }La classe SurvMetier
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 public class SurvMajBdd extends Thread{ private SurvMetier monSurvMetier; public SurvMajBdd(SurvMetier lInterface) { monSurvMetier = lInterface; } public void run() { Random rnd; int tempo = 0; while(Thread.currentThread().isInterrupted() == false) { //Je lance la surveillance de la bdd monSurvMetier.recupererMajListe(); try { //TEST //tempo = 0; //NON TEST //On endors le thread pendant un temps aléatoire entre 1 et 30 secondes rnd = new Random(); tempo = rnd.nextInt(29); sleep((tempo+1)*1000); } catch(InterruptedException e) { GestionLoggerBdd.getLogger().log(Level.WARNING,"Thread SurvProjet interrompu dans son sommeil",e); Thread.currentThread().interrupt(); } } GestionLoggerBdd.getLogger().log(Level.INFO,"Thread SurvProjet arrete"); } }
La classe qui effectue les traitements
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public class SurvMetier { GestionDonnee monGestionnaire; public SurvMetier() { monGestionnaire = new GestionDonnee(); } synchronized void recupererMajListe() { GestionLoggerProductionFichier.getLogger().log(Level.INFO, "######### DEBUT recupererMajListe #########"); monGestionnaire.creerFichierMAJ(); GestionLoggerProductionFichier.getLogger().log(Level.INFO, "######### FIN recupererMajListe #########"); } synchronized void traiterFichierProduit() { GestionLoggerProductionFichier.getLogger().log(Level.INFO, "######### DEBUT traiterFichierProduit #########"); monGestionnaire.traiterFichierProduit(); GestionLoggerProductionFichier.getLogger().log(Level.INFO, "######### FIN traiterFichierProduit #########"); } }
et la méthode d'accès à la bdd présente dans la classe BddMySql
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 public class GestionDonnee { //-- Donnée de l'application --// private int nbTentativeInsertionEnBase; private int NB_MAX_TENTATIVE = 2; public GestionDonnee() { maBDD = new BddMySql(); } public void traiterFichierProduit() { GestionLoggerProductionFichier.getLogger().log(Level.FINE, "Debut méthode"); LinkedList<TempsSurv> lesTemps = null; TempsSurv leTemps = null; String leFichier = ""; String lePath = ""; boolean premierErreur = false; //On essaye d'ouvrir la connexion try { //Ouverture de la connexion avec la BDD maBDD.connexion(GestionLoggerProductionFichier.getLogger()); //On regarde si il y a un fichier TempsSurv dans le rep final lePath = monXML.getPathExploitationFinal(); leFichier = monXML.fichierTempsSurvFinalExiste(); } catch(Exception e) { GestionLoggerProductionFichier.getLogger().log(Level.INFO, "La BDD distante n'est pas atteignable, travail en mode déconnecté"); premierErreur = true; } GestionLoggerProductionFichier.getLogger().log(Level.FINE, "Fin méthode"); } public void creerFichierMAJ() { GestionLoggerBdd.getLogger().log(Level.INFO, "Debut méthode"); boolean premierErreur = false; long laDateMaj = -1; try { //Ouverture de la connexion avec la BDD GestionLoggerBdd.getLogger().log(Level.INFO, "Je tente la connexion"); maBDD.connexion(GestionLoggerBdd.getLogger()); } catch(Exception e) { GestionLoggerProductionFichier.getLogger().log(Level.INFO, "La BDD distante n'est pas atteignable, travail en mode déconnecté"); premierErreur = true; } } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 public void connexion(Logger leLogger) throws Exception { leLogger.log(Level.INFO, "Debut methode"); conn = null; st = null; try { leLogger.log(Level.INFO, "Class.forName(com.mysql.jdbc.Driver)"); nbConnection++; leLogger.log(Level.INFO, "NB CONNECTION : "+nbConnection); DriverManager.setLoginTimeout(5); leLogger.log(Level.INFO, "TIMEOUT: "+DriverManager.getLoginTimeout()); conn = DriverManager.getConnection(strConnexion, user, strMdp); leLogger.log(Level.INFO, "conn.createStatement()"); st = conn.createStatement(); leLogger.log(Level.INFO, "Apres"); } catch(SQLException e) { leLogger.log(Level.WARNING, "CONNEXION IMPOSSIBLE : ",e); fermerConnexion(leLogger); throw e; } catch(Exception e){ leLogger.log(Level.WARNING, "CONNEXION IMPOSSIBLE : ",e); throw e; } leLogger.log(Level.INFO, "Fin methode"); }
Partager