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

Servlets/JSP Java Discussion :

[JSP / Servlet] Fuite mémoire


Sujet :

Servlets/JSP Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2015
    Messages : 67
    Points : 35
    Points
    35
    Par défaut [JSP / Servlet] Fuite mémoire
    Bonjour,

    j'ai deployé mon application web (Jsp -servlet) sur tomcat8.
    Tous ce passe bien, sauf que je doit recharger chaque matin mon webapplication.
    J'ai constaté le ficher d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    WARNING [http-nio-8181-exec-550] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc 
    The web application [comparateur] registered the JDBC driver [com.mysql.jdbc.Driver] 
    but failed to unregister it when the web application was stopped. 
    To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
    Comment je peux le fixer?

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2015
    Messages : 67
    Points : 35
    Points
    35
    Par défaut
    J'ai utilisé une calss pour registered the JDBC driver manuellement.
    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
     
    package servlets;
     
    import java.sql.Driver;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.Enumeration;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
     
    public class MyContextListener implements ServletContextListener{
     
     @Override
     public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("App shutdown ...");
     
        System.out.println("Deregistering SQL-Drivers ...");
        Enumeration<Driver> drivers = DriverManager.getDrivers();
        while (drivers.hasMoreElements()) {
            Driver driver = drivers.nextElement();
            try {
                DriverManager.deregisterDriver(driver);
                System.out.println(driver.getClass().getName());
            } catch (SQLException e) {
                System.err.println("Error deregistering driver " + driver.getClass().getName());
            }
        }
     }
     
     @Override
     public void contextInitialized(ServletContextEvent arg0) {
     }
    }
    J'ai ajouter biensur dans le web.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <listener>
            <listener-class>
                servlets.MyContextListener
            </listener-class>
        </listener>
    voila ma connexion au DB au niveau de java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private String dbName = "NameDB";
    private String user = "root";
    private String pass = "PWD";   
    private String server = "localhost";
    le message est changé mnt mais même probléme je doit recharger mon war :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INFO [http-nio-8181-exec-579] org.apache.catalina.core.ApplicationContext.log HTMLManager: list: Listing contexts for virtual host 'localhost'

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 241
    Points : 399
    Points
    399
    Par défaut
    Bonjour,

    Le message de Tomcat est intéressant.
    Il stipule la chose suivante:
    Ta webapp a provoqué le chargement du Driver JDBC pour une base MySQL dans son propre ClassLoader.
    Ton context listener apporte une réponse en ce sens qu'il provoque l'opération opposée ( deregisterDriver() ).

    Ce point étant fixé, je ne comprends pas très bien ce que tu veux dire
    Tous ce passe bien, sauf que je doit recharger chaque matin mon webapplication.
    Pourquoi devoir recharger ta webapp? Est-ce pour prendre en compte une nouvelle version/livraison?

    Dans l'attente,
    Sébastien

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2015
    Messages : 67
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    l'application se run, la page d'index s'affiche et la créeation de session au niveau de manager de tomcat est faite.
    Mais le problème est au niveau de la connexion avec DB.
    Pour que je puisse accéder a mon application, je doit le recharger (pas deployer) chaque le matin.

    j'ai essayé de régler ca avec cette class (MyContextListener) ...comme d'hab cette problème.
    J'ai enlever le jar jdbc au niveau de lib de tomcat ...comme d'hab cette problème.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 241
    Points : 399
    Points
    399
    Par défaut
    Bonjour,

    je suspecte un problème de gestion de connexion.

    Est-ce que c'est ton code qui crée la connexion à la bdd, ou bien c'est Tomcat qui te fournit une DataSource ( mais j'ai un doute vu le 2nd poste ) ?

    Cordialement,
    Sébastien

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2015
    Messages : 67
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    Mon code:
    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
     
    public class ConDB
    {
    private static Connection con = null;
    private String dbName = "NameDB";
    private String user = "root";
    private String pass = "PWD";   
    private String server = "localhost";
     
     private ConDB()
        {
            try
            {
     
                Class.forName("com.mysql.jdbc.Driver");
                String encoding = "?useUnicode=true&characterEncoding=UTF-8";
     
                String conString = "jdbc:mysql://" + server + "/" + dbName + encoding;
     
     
                con = (Connection) DriverManager.getConnection(conString,user,pass);
     
            }
            catch(ClassNotFoundException e)
            {
                e.printStackTrace();
            }
            catch(SQLException e1)
            {
                e1.printStackTrace();
            }
        }
        public static Connection getInstance()
        {
            if(con == null)
                new ConDB();
     
            return con;
     
        }
    }

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Alors tu peux enlever ton context listener.

    Ensuite dans ton code.
    Le chargement du driver ne doit se faire qu'une seule fois; à priori c'est le cas.
    Cependant, tu ne dois pas partager une connexion pour ton application, tu dois ouvrir et fermer une connexion à chaque requête HTTP du client. (en gros, même si ce n'est pas tout à fait exact)
    Tu peux aussi passer par un pool de connexions que Tomcat gère très bien, ce qui ne t'empêchera pas de bien fermer des connexions pour les rendre au pool.

  8. #8
    Membre actif
    Homme Profil pro
    Développeur Java/JavaEE
    Inscrit en
    Août 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java/JavaEE

    Informations forums :
    Inscription : Août 2014
    Messages : 194
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    Configure ta connexion avec autoReconnect=true. Ceci est une propriété de la chaîne de connexion de l'URL, qui travaille au niveau du pilote.
    Vous devez faire cette modification dans la configuration de la source de données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    conString ="jdbc:mysql: .... ?autoReconnect=true"

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2015
    Messages : 67
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    C'est un site ou on utilise trop la connexion avec DB.
    Il est développer depuis long temps presque 7 mois.
    J'ai pensé le problème depuis l’hébergeur. J'ai changer vers un autre mnt

  10. #10
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 241
    Points : 399
    Points
    399
    Par défaut
    Bonjour,

    Merci de nous avoir montré le code utilisé pour la connexion à la bdd.
    A la lecture du code, on comprend la chose suivante:
    • Il n'y a qu'une et une seule connexion à la base de donnée ( attribut static connection ), pour toute la durée de vie de l'application
    • La connexion n'est pas fermée par le code appelant, et n'en fait aucune gestion propre.


    Comme tu n'as qu'une seule connexion à la base de données, il y a de forte chance pour qu'elle finisse par s'interrompre ( typiquement pour inactivité , ou bien redémarrage du serveur MySQL ).
    => Ceci peut expliquer simplement pourquoi, chaque matin, ton application est indisponible et qu'il faille relancer l'application.

    La proposition de Maine13 est une action très court terme à mener pour t'éviter de relancer l'application chaque matin.
    Cependant, ça n'est pas une solution pérenne

    Il faut clairement revoir le code en interaction avec la connexion JDBC, ce qui peut représenter un effort important mais qui assurera une viabilisation à cette application.

    Bon courage,
    Sébastien

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    +1

    On ne maintient pas une connection ad vitam sur un serveur java.
    On ne partage JAMAIS une connection jdbc entre plusieurs thread, ce que tu fais, car ça amène tout un tas de problèmes de concurrence, de ressources perdues, de mélange entre les clients


    On utilise un datasource avec un pool de connexions derrière.
    https://docs.oracle.com/javase/tutor...tasources.html

    En gros mis à part ton reset journalier, tu as certainement eu beaucoup de chance jusque là que ça n'aie pas plus pêté que ça. Peut être que personne n'utilise l'application, ça pourrait expliquer.

Discussions similaires

  1. fuite mémoire dans le JSP editor
    Par ChristopheH dans le forum Eclipse Java
    Réponses: 0
    Dernier message: 18/04/2008, 17h20
  2. [JSP/Servlet] Outils pour developper?
    Par BenoitM dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 04/05/2004, 11h03
  3. [JSP][Servlet][Javabean] Modèle Vue Controleur
    Par ay_pepito dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 04/02/2004, 10h05
  4. [JSP][SERVLET] recup donnees form
    Par 74greg dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 04/09/2003, 10h22
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 17h20

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