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 :

mysql.jdbc.exceptions: "Too many connections"


Sujet :

Servlets/JSP Java

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur Informatique et Réseaux
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Informatique et Réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Par défaut mysql.jdbc.exceptions: "Too many connections"
    Bonjour,

    dans une application web, après un certain nombre de requete, j'ai cette exception:

    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"


    Je sais que cela vient du fait que je ne ferme pas le Statement ou le ResultSet mais quand je les ferme, j'ai l'erreur suivante:

    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after statement closed.


    Je pense que c'est un problème dans mon code, donc je vous donne quelques sources:


    AgentDaoImpl.java:
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    public class AgentDaoImpl implements AgentDaoInter {
     
        private ArrayList agents = new ArrayList();
        private Bdd bdd;
        private Statement stm;
        private ResultSet rep;
     
        public AgentDaoImpl() {
            bdd = new Bdd();
            stm = bdd.getStm();
            rep = null;
        }
     
        @Override
        public Collection getAll() {
            try {
                rep = stm.executeQuery("SELECT ...");
                agents.clear();
                while (rep.next()) {
                    agents.add(new Agent(rep.getInt("id_ag"), rep.getString("nom_ag"), rep.getString("prenom_ag"), rep.getString("mail_ag")));
                }
                return agents;
            } catch (SQLException ex) {
                Logger.getLogger(AgentDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                bdd.close();
            }
            return null;
        }
     
        @Override
        public Collection getWithCommune(int id) {
            try {
                rep = stm.executeQuery("SELECT ...");
                agents.clear();
                while (rep.next()) {
                    agents.add(new Agent(rep.getInt("id_ag"), rep.getString("nom_ag"), rep.getString("prenom_ag"), rep.getString("mail_ag")));
                }
                return agents;
            } catch (SQLException ex) {
                Logger.getLogger(AgentDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                bdd.close();
            }
            return null;
        }
     
        @Override
        public Collection getWithSession(int id) {
            try {
                rep = stm.executeQuery("SELECT ...");
                agents.clear();
                while (rep.next()) {
                    agents.add(new Agent(rep.getInt("id_ag"), rep.getString("nom_ag"), rep.getString("prenom_ag"), rep.getString("mail_ag")));
                }
                return agents;
            } catch (SQLException ex) {
                Logger.getLogger(AgentDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                bdd.close();
            }
            return null;
        }
     
        @Override
        public Agent getOne(int id) {
            try {
                rep = stm.executeQuery("SELECT ...");
                agents.clear();
                while (rep.next()) {
                    agents.add(new Agent(rep.getInt("id_ag"), rep.getString("nom_ag"), rep.getString("prenom_ag"), rep.getString("mail_ag")));
                }
                return (Agent) agents.get(0);
            } catch (SQLException ex) {
                Logger.getLogger(AgentDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                bdd.close();
            }
            return null;
        }
     
        @Override
        public void saveOne(Agent agent) {
    // ajout ou modification ?
            if (agent.getId() == -1) {
    // ajout
                insertAgent(agent);
            } else {
    //modification
                updateAgent(agent);
            }
        }
     
    // supprimer un agent
        @Override
        public void deleteOne(int id) {
            try {
                stm.executeUpdate("DELETE ...");
                stm.executeUpdate("DELETE ...");
            } catch (SQLException ex) {
                Logger.getLogger(AgentDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                bdd.close();
            }
        }
     
    // ajouter un agent
        private void insertAgent(Agent agent) {
            try {
                stm.executeUpdate("INSERT ...");
            } catch (SQLException ex) {
                Logger.getLogger(AgentDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                bdd.close();
            }
        }
     
    // modifier un agent
        private void updateAgent(Agent agent) {
            try {
                stm.executeUpdate("UPDATE ...");
            } catch (SQLException ex) {
                Logger.getLogger(AgentDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                bdd.close();
            }
        }
    }
    j'instancie cette classe à chaque fois que je lance ma servlet ce qui créer une nouvelle instance de Bdd donc je ne comprends pas pourquoi ne pas la fermer pose problème et pourquoi la fermer en pose aussi.

    GestionAgentServlet.java:
    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 GestionRespVilleServlet extends HttpServlet {
     
        /** 
         * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
         * @param request servlet request
         * @param response servlet response
         * @throws ServletException if a servlet-specific error occurs
         * @throws IOException if an I/O error occurs
         */
     
    // services
        AgentServiceImpl agentService = null;
     
        protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            try {
     
    // on récupère la méthode d'envoi de la requête
                String méthode = request.getMethod().toLowerCase();
    // on récupère l'action à exécuter
                String action = request.getPathInfo();
     
    // on initialise les services
                AgentDaoImpl agentDao = new AgentDaoImpl();
                agentService = new AgentServiceImpl();
                agentService.setDao(agentDao);
     
    // affichage liste des agents
            ArrayList agents = (ArrayList) agentService.getAll();
            request.setAttribute("agents", agents);
    // affichage de la vue [list]
            getServletContext().getRequestDispatcher("/agent/list.jsp").forward(request, response);
     
    }
    Voila le code de la classe Bdd.java:
    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
     
    public class Bdd {
     
        private static final String pilote = "com.mysql.jdbc.Driver";
        private Connection connexion;
        private Statement stm;
     
        public Bdd()
        {
            try {
                Class.forName(pilote);
            } catch (ClassNotFoundException ex) {Logger.getLogger(Bdd.class.getName()).log(Level.SEVERE, null, ex);}
            try {
                connexion = DriverManager.getConnection("jdbc:mysql://localhost/MyApp", "MyLogin", "MyPassword");
                this.stm = connexion.createStatement();
            } catch (SQLException ex) {Logger.getLogger(Bdd.class.getName()).log(Level.SEVERE, null, ex);}
        }
     
        public Statement getStm() {
            return stm;
        }
     
        public void close(){
            try {
                connexion.close();
            } catch (SQLException ex) {
                Logger.getLogger(Bdd.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    Merci de votre aide.

  2. #2
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Un Statement est associée à une connexion, si tu fermes la connexion, tu dois oublier les statement qui vont avec. Idem pour les resultset qui sont associés à des statement.


    EDIT: Il serait bien de comitter explicitement.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Les Statement ou les ResultSet non fermés peuvent poser des problèmes de mémoire ou des problèmes transactionnels, mais en aucun cas des problèmes de connexion car ils sont appelés alors que la connexion est déjà ouverte (du moins réputée ouverte).

    Peut-on connaitre la stacktrace de l'exception ? au au moins à quelle ligne de votre code l'exception est levée ?

    Et éventuellement, peut-on voir l'extrait de code qui instancie les objets Bdd ?
    Est-ce que l'appel à la méthode "close" de ces objets est garantie ? (cad dans le clause finally d'un try).

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    EN faite le problème vient du fait que tu stockes l'agentService comme attribut de la servlet !!!

    La servlet peut être instanciée au besoin plusieurs fois mais généralement elle ne le sera qu'une fois pour toute l'application. Donc potentiellement deux requêtes simultanées seront traitées avec le même agentService => même DAO => même connection/même statement => potentiellement clos.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur Informatique et Réseaux
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Informatique et Réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Par défaut
    Merci beaucoup, problème résolu: un "close()" de la connexion ferme aussi le Statement et le ResultSet, le problème était que je faisais 2 accès à la base de données avec la même connexion en fermant celle-ci entre les 2.

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

Discussions similaires

  1. [Hibernate / Spring / Cluster / JDBC] Erreur "Too many connections"
    Par wiss85 dans le forum Persistance des données
    Réponses: 1
    Dernier message: 18/10/2012, 11h14
  2. Impossible redémarrer mysql (too many connections)
    Par headz_ dans le forum Administration
    Réponses: 1
    Dernier message: 15/03/2010, 09h17
  3. "Too many connection" avec Mysql
    Par grominet_79 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 03/02/2009, 13h32
  4. Too many connections - Configuration MySQL
    Par Adz3 dans le forum Requêtes
    Réponses: 5
    Dernier message: 27/01/2006, 17h09

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