Partage
  • Partager sur Facebook
  • Partager sur Twitter

NodeJS - Erreur MySQL "Too Many Connections"

    20 octobre 2018 à 10:17:01

    Salut à tous,

    Je viens vous voir afin que vous puissiez m'aider à trouver une solution à un problème sur ma première application en nodejs. J'ai eu aucuns soucis à la créer. Sauf que j'ai remarqué qu'elle ouvrait une connexion SQL à chaque requêtes sans la fermer. Du coup au final le serveur SQL se bloque en Too Many Connections....

    var createError = require('http-errors');
    var express = require('express');
    var path = require('path');
    var cookieParser = require('cookie-parser');
    var logger = require('morgan');
    
    var indexRouter = require('./routes/index');
    var usersRouter = require('./routes/users');
    var titresRouter = require('./routes/titres');
    var afficheursRouter = require('./routes/afficheurs');
    var filesRouter = require ('./routes/datafiles');
    //var presetsRouter = require ('./routes/presets');
    
    var app = express();
    var mysql = require("mysql");
    app.use(function(req, res, next){
    	global.connection = mysql.createConnection({
    		host     : 'localhost',
    		user     : 'root',
    		password : 'monmotdepasse',
    		database : 'mabasededonnees'
    	});
    	connection.connect();
    	next();
    
    });
    
    app.engine('pug', require('pug').__express)
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'pug');
    
    app.use(logger('dev'));
    app.use(express.json());
    app.use(express.urlencoded({ extended: false }));
    app.use(cookieParser());
    app.use(express.static(path.join(__dirname, 'public')));
    
    app.use('/', indexRouter);
    app.use('/v1/users', usersRouter);
    app.use('/v1/titres', titresRouter);
    app.use('/v1/afficheurs', afficheursRouter);
    app.use('/v1/files', filesRouter);
    //app.use('/v1/presets', presetsRouter);
    
    app.use(function(req, res, next) {
      next(createError(404));
    });
    
    app.use(function(err, req, res, next) {
      res.locals.message = err.message;
      res.locals.error = req.app.get('env') === 'development' ? err : {};
    
      res.status(err.status || 500);
      res.render('error');
    });
    
    module.exports = app;
    

    Merci pour votre aide :)



    • Partager sur Facebook
    • Partager sur Twitter
      24 octobre 2018 à 16:36:13

      Salut Chriis,

      Tout d'abord, voici un lien qu'il est toujours bon de rappeler, celui de la doc du package mysql : https://www.npmjs.com/package/mysql

      Pour ton problème, il suffit d'utiliser la méthode release() pour libérer la connexion proprement et ne pas avoir un handle de la connexion pour chaque requête.

      connection.query('SELECT something FROM sometable', function (error, results, fields) {
          // When done with the connection, release it.
          connection.release();
       
          // Handle error after the release.
          if (error) throw error;
       
          // Don't use the connection here, it has been returned to the pool.
        });

      Sinon, tu as une autre façon, parce que je conçois que ce soit un peu chiant de libérer manuellement les connexions à chaque requête, tu peux t'écrire un petit script qui créer une connexion unique (avec createConnection) qui sauvegarde la connection dans une seule variable qui ne change pas du long de l'éxecution de ton application et tu récupère cette variable pour executer tes requêtes, de la sorte une seule et unique connexion est utilisée pour executer tes requête, au lieu de une connexion unique pour chaque requêtes uniques.

      Voici ce que j'ai codé et que j'utilise personnellement dans mes projets pour mysql 

      À mon sens c'est la façon la plus propre de faire, une seule connexion pour n requêtes au lieu de n connexions que tu dois manuellement fermées pour n requêtes.

      • Partager sur Facebook
      • Partager sur Twitter

      NodeJS - Erreur MySQL "Too Many Connections"

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown