IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Struts 1 Java Discussion :

[Struts] datasource, plantage si connexions pas fermées [FAQ]


Sujet :

Struts 1 Java

  1. #1
    Membre éclairé Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut [Struts] datasource, plantage si connexions pas fermées
    Bonjour,

    J'ai un problème avec l'utilisation d'un datasource

    Contexte :

    J'ai un datasource décléré dans struts, je l'initialise au démarrage de mon appli et je le stocke dans une classe Singleton pour y avoir accès tout le temps

    Si mes connexions sont mal fermées, c'est carrément mon serveur TomCat qui plante !

    Méthode d'accès aux données :

    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
     
            try {
                Connection conn = AccesBD.getInstance().getDs().getConnection();
     
                PreparedStatement prep = conn.prepareStatement("SELECT * FROM POSTE WHERE CODE_POSTE = ?");
                prep.setString(1, uneProduction.getPoste().getCodePoste());
                ResultSet rs = prep.executeQuery();
                if (rs.next()) {       
                        //traietments
     
                }
                prep1.close();
                conn.close();
                return true;
            } catch (SQLException e) {
                System.out.println("Erreur  : " + e.getMessage());
                return false;
            }
    Mon problème est que, si j'ai une exceprion "SQLException", je vais dans mon catch et ma connexion n'est pas fermée !
    J'ai bien essayé de faire un dans le catch, mais si la connexion n'a pas été initialisée avant, ca plante.

    Donc il arrive dans certains cas que si je vais dans mon catch, ma connexion n'et pas fermée et lorsque plusieurs connexions ne se ferment pas, mon serveur plante (en fait mon appli est boquée, mais je n'est pas d'erreur TomCat particulière)

    Est-ce qu'il existe un moyen pour fermer toutes les connexions d'un coup ?
    Pourquoi mon serveur ne répond plus ?

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut Re: [Struts] datasource, plantage si connexions pas fermées
    Salut,

    Citation Envoyé par danyboy85
    Mon problème est que, si j'ai une exceprion "SQLException", je vais dans mon catch et ma connexion n'est pas fermée !
    J'ai bien essayé de faire un dans le catch, mais si la connexion n'a pas été initialisée avant, ca plante.
    Il suffit de vérifier avant que ta connection ne soit pas null, mais de toutes manières les fermetures de flux et les libération de ressources doivent obligatoirement être effectué dans un bloc finally (voir plus bas), et non pas dans le try ou les catch...

    Citation Envoyé par danyboy85
    Donc il arrive dans certains cas que si je vais dans mon catch, ma connexion n'et pas fermée et lorsque plusieurs connexions ne se ferment pas, mon serveur plante (en fait mon appli est boquée, mais je n'est pas d'erreur TomCat particulière)
    En fait Tomcat gère un pool de connection. Ce pool a une limite maximum de connection à utiliser en même temps. Si tu atteins cette limite il attendra qu'une connection soit libéré (fermé) pour la réutiliser dans ton code.
    Donc en cas de surcharge ton application peut être ralenti mais ne plantera pas (alors que cela peut être le cas si trop de connection sont ouverte).

    Dans ton cas comme tu ne fermes pas toujours tes connections proprement, tu atteins la limite de connection utilisable, et Tomcat attend qu'une d'entre elles soit fermé... mais comme ce ne sera jamais le cas ta servlet est bloqué en attente de la connection...

    Citation Envoyé par danyboy85
    Est-ce qu'il existe un moyen pour fermer toutes les connexions d'un coup ?
    Pourquoi mon serveur ne répond plus ?
    Oui : lorsque tu utilises des objets qui utilisent des ressources qui doivent être libérés (généralement avec un close()) tel que la lecture/écriture de flux ou les connections JDBC, tu dois utiliser un bloc try/finally :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     // initialisation
    try {
           // utilisation des ressources
    } catch (...) {
          // gestion des exceptions (optionnel)
    } finally {
           // fermeture des ressources
    }
    Une fois que tu es dans le bloc try, tu es sûr que le code du bloc finally soit exécuté quoi qu'il arrive, c'est à dire :
    • Lorsque tu atteins la fin de ton bloc try
    • A la fin de ton catch si une exception est remontée et intercepté.
    • Lorsque tu fais un return (dans le bloc try ou un des catch).
    • Lorsque une exception de ton bloc try (ou un de tes bloc catch) n'est pas intercepté (par exemple NullPointerException).
    • ... (il y a surement d'autre cas de figure que je n'ai pas en tête).



    Donc ton code devrait ressembler à ceci :
    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
    Connection conn = null;
    PreparedStatement prep = null;
    ResultSet rs = null;
     
    try {
    	conn = AccesBD.getInstance().getDs().getConnection();
     
    	prep = conn.prepareStatement("SELECT * FROM POSTE WHERE CODE_POSTE = ?");
    	prep.setString(1, uneProduction.getPoste().getCodePoste());
     
    	rs = prep.executeQuery();
    	if (rs.next()) {       
    		//traietments
    	}
    	return true;
     
    } catch (SQLException e) {
    	System.out.println("Erreur  : " + e.getMessage());
    	return false;
     
    } finally {
     
    	closeResultSet(rs);
    	closeStatement(prep);
    	closeConnection(conn);
     
    }
    Avec les méthodes closeResultSet(), closeStatement() et closeConnection() de la manière suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static void closeResultSet (ResultSet rs) {
    	if (rs!=null) {
    		try {
    			rs.close();
    		}
    		catch (SQLException e) {
    			System.out.println("Erreur  : " + e.getMessage());
    		}
    	}
    }
    Cela permet de femer propre l'élément s'il n'est pas null. On est obligé d'intercepter l'exception afin d'être sûr que les trois objet soit bien fermé...

    Il faut malheureusement recoder le même code dans les trois méthodes. A noter toutefois que pour les flux de fichier on peut utilsier l'interface Closeable pour éviter de recoder la même méthode pour différents objets, mais les classes de JDBC n'implemente pas cette interface...


    a++

  3. #3
    Membre éclairé Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Merci beaucoup adiGuba pout tes explications claires et concises.

    Je fais m'efforcer de respecter ces méthodes et mon problème devrait être très vite résolu !

    Bonne journée !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/04/2014, 16h05
  2. [Débutant] erreur "La connexion n'est pas fermée"
    Par bouchra19 dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/07/2012, 18h37
  3. [c#]erreur : La connexion n'est pas fermée.
    Par koukou0687 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 27/01/2011, 23h23
  4. Réponses: 1
    Dernier message: 06/03/2007, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo