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
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2015
    Messages : 67
    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
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2015
    Messages : 67
    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 chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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
    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
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2015
    Messages : 67
    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 chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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
    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
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2015
    Messages : 67
    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
    Membre Expert
    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
    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 expérimenté
    Homme Profil pro
    Développeur Java/JavaEE
    Inscrit en
    Août 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Août 2014
    Messages : 194
    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
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2015
    Messages : 67
    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 chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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
    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
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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