105 votes

node.js + pooling de connexion mysql

J'essaie de comprendre comment structurer mon application pour utiliser MySQL de la manière la plus efficace. J'utilise le module node-mysql. D'autres fils de discussion ici ont suggéré d'utiliser le pooling de connexion, donc j'ai mis en place un petit module mysql.js.

var mysql = require('mysql');

var pool  = mysql.createPool({
    host     : 'localhost',
    user     : 'root',
    password : 'root',
    database : 'guess'
});

exports.pool = pool;

Maintenant, chaque fois que je veux interroger mysql, j'ai besoin de ce module et j'interroge la base de données.

var mysql = require('../db/mysql').pool;

var test = function(req, res) {
     mysql.getConnection(function(err, conn){
         conn.query("select * from users", function(err, rows) {
              res.json(rows);
         })
     })
}

Est-ce une bonne approche ? Je n'ai pas vraiment trouvé beaucoup d'exemples d'utilisation de connexions mysql à part un exemple très simple où tout est fait dans le fichier principal app.js script donc je ne sais pas vraiment quelles sont les conventions / les meilleures pratiques.

Dois-je toujours utiliser connection.end() après chaque requête ? Et si je l'oublie quelque part ?

Comment réécrire la partie exports de mon module mysql pour ne retourner qu'une connexion afin de ne pas avoir à écrire getConnection() à chaque fois ?

1voto

Yordan Points 28

En utilisant la méthode standard mysql.createPool(), les connexions sont créées paresseusement par le pool. Si vous configurez le pool pour permettre jusqu'à 100 connexions, mais que vous n'en utilisez que 5 simultanément, seules 5 connexions seront établies. Cependant, si vous le configurez pour 500 connexions et que vous utilisez les 500, elles resteront ouvertes pendant toute la durée du processus, même si elles sont inactives !

Cela signifie que si le nombre maximal de connexions de votre serveur MySQL est de 510, votre système ne disposera que de 10 connexions MySQL jusqu'à ce que votre serveur MySQL les ferme (en fonction de la valeur que vous avez fixée pour le délai d'attente) ou que votre application se ferme ! La seule façon de les libérer est de fermer manuellement les connexions via l'instance de pool ou de fermer le pool.

Le module mysql-connection-pool-manager a été créé pour résoudre ce problème et faire évoluer automatiquement le nombre de connexions en fonction de la charge. Les connexions inactives sont fermées et les pools de connexion inactifs sont éventuellement fermés s'il n'y a pas eu d'activité.

    // Load modules
const PoolManager = require('mysql-connection-pool-manager');

// Options
const options = {
  ...example settings
}

// Initialising the instance
const mySQL = PoolManager(options);

// Accessing mySQL directly
var connection = mySQL.raw.createConnection({
  host     : 'localhost',
  user     : 'me',
  password : 'secret',
  database : 'my_db'
});

// Initialising connection
connection.connect();

// Performing query
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});

// Ending connection
connection.end();

Réf : https://www.npmjs.com/package/mysql-connection-pool-manager

1voto

MD SHAYON Points 93

Vous pouvez utiliser ce format comme je l'ai fait

    const mysql = require('mysql');
    const { HOST, USERNAME, PASSWORD, DBNAME, PORT } = process.env;
    console.log();
    const conn = mysql.createPool({
        host: HOST,
        user: USERNAME,
        password: PASSWORD,
        database: DBNAME
    }, { debug: true });

    conn.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
        if (error) throw error;
        console.log('Db is connected - The solution is: ', results[0].solution);
    });

    module.exports = conn;

-7voto

Alex Points 143

J'utilise toujours connection.relase() ; après pool.getconnection comme suit

pool.getConnection(function (err, connection) {
      connection.release();
        if (!err)
        {
            console.log('*** Mysql Connection established with ', config.database, ' and connected as id ' + connection.threadId);
            //CHECKING USERNAME EXISTENCE
            email = receivedValues.email
            connection.query('SELECT * FROM users WHERE email = ?', [email],
                function (err, rows) {
                    if (!err)
                    {
                        if (rows.length == 1)
                        {
                            if (bcrypt.compareSync(req.body.password, rows[0].password))
                            {
                                var alldata = rows;
                                var userid = rows[0].id;
                                var tokendata = (receivedValues, userid);
                                var token = jwt.sign(receivedValues, config.secret, {
                                    expiresIn: 1440 * 60 * 30 // expires in 1440 minutes
                                });
                                console.log("*** Authorised User");
                                res.json({
                                    "code": 200,
                                    "status": "Success",
                                    "token": token,
                                    "userData": alldata,
                                    "message": "Authorised User!"
                                });
                                logger.info('url=', URL.url, 'Responce=', 'User Signin, username', req.body.email, 'User Id=', rows[0].id);
                                return;
                            }
                            else
                            {
                                console.log("*** Redirecting: Unauthorised User");
                                res.json({"code": 200, "status": "Fail", "message": "Unauthorised User!"});
                                logger.error('*** Redirecting: Unauthorised User');
                                return;
                            }
                        }
                        else
                        {
                            console.error("*** Redirecting: No User found with provided name");
                            res.json({
                                "code": 200,
                                "status": "Error",
                                "message": "No User found with provided name"
                            });
                            logger.error('url=', URL.url, 'No User found with provided name');
                            return;
                        }
                    }
                    else
                    {
                        console.log("*** Redirecting: Error for selecting user");
                        res.json({"code": 200, "status": "Error", "message": "Error for selecting user"});
                        logger.error('url=', URL.url, 'Error for selecting user', req.body.email);
                        return;
                    }
                });
            connection.on('error', function (err) {
                console.log('*** Redirecting: Error Creating User...');
                res.json({"code": 200, "status": "Error", "message": "Error Checking Username Duplicate"});
                return;
            });
        }
        else
        {
            Errors.Connection_Error(res);
        }
    });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X