blocage du programme sur méthode getConnexion
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:
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");
}
} |
Code:
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 SurvMetier
Code:
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 #########");
}
} |
La classe qui effectue les traitements
Code:
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;
}
}
} |
et la méthode d'accès à la bdd présente dans la classe BddMySql
Code:
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");
} |