2013-08-28 21 views
42

Ich versuche herauszufinden, wie ich meine Anwendung strukturieren kann, um MySQL möglichst effizient zu nutzen. Ich benutze das Modul node-mysql. Andere Threads hier vorgeschlagen Connection-Pooling zu verwenden, damit ich ein wenig Modul bis mysql.jsnode.js + mysql connection pooling

var mysql = require('mysql'); 

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

exports.pool = pool; 

Nun, wenn ich mysql abfragen möchten benötige ich dieses Modul und dann fragen Sie die databse

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); 
     }) 
    }) 
} 

Ist das guter Ansatz? Ich konnte nicht wirklich viele Beispiele für die Verwendung von mysql-Verbindungen finden, abgesehen von einer sehr einfachen, bei der alles im Haupt-Script von app.js gemacht wird, so dass ich nicht wirklich weiß, was die Konvention/Best Practices sind.

Sollte ich connection.end() nach jeder Abfrage immer verwenden? Was, wenn ich es irgendwo vergesse?

Wie umschreiben Sie den Exportteil meines mysql-Moduls, um nur eine Verbindung zurückzugeben, also muss ich getConnection() nicht jedes Mal schreiben?

Antwort

37

Es ist ein guter Ansatz.

Wenn Sie nur eine Verbindung bekommen Sie den folgenden Code zu Ihrem Modul hinzufügen, wenn der Pool ist in:

var getConnection = function(callback) { 
    pool.getConnection(function(err, connection) { 
     callback(err, connection); 
    }); 
}; 

module.exports = getConnection; 

Sie haben noch getConnection jedes Mal zu schreiben. Aber Sie könnten die Verbindung in dem Modul speichern, wenn Sie es das erste Mal erhalten.

Vergessen Sie nicht, die Verbindung zu beenden, wenn Sie es nicht mehr verwenden:

connection.release(); 
+10

nur auf ein Heads. Es ist 'connection.release();' jetzt für Pools. – sdanzig

+0

Das stimmt.Ich habe es geändert. – Klaasvaak

+0

Auch, wenn ich kann, würde ich vorschlagen, ein Versprechen statt Rückruf zu verwenden, aber das ist nur eine Vorliebe ... großartige Lösung dennoch – Spock

10

Sie werden diese Wrapper nützlich finden :)

es erforderlich, verwenden Sie es wie folgt aus:

db.connection.query("SELECT * FROM `table` WHERE `id` = ? ", row_id) 
      .on('result', function (row) { 
      setData(row); 
      }) 
      .on('error', function (err) { 
      callback({error: true, err: err}); 
      }); 
-2

ich verwende immer connection.relase(); nach pool.getconnetion wie

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); 
     } 
    }); 
+0

etwas falsch daran ?? – Alex

+3

Denken Sie nicht, dass Sie die Verbindung freigeben sollten * bevor * Sie es verwenden, um abzufragen – kwhitley

+0

Ja, das sind schlechte Nachrichten .... es ist ein Nebeneffekt der asynchronen Natur der Dinge, die Sie mit dieser Version bekommen. Wenn Sie etwas Latenz einführen, werden Sie diese Abfrage nicht sehen. Das Muster ist ... pool.getConnection (function (err, connection)) { // Verwenden Sie die Verbindung connection.query ('SELECT etwas aus Somethable', Funktion (Fehler, Ergebnisse, Felder)) { // And erfolgt mit der Verbindung connection.release();. // Handle Fehler nach der Freigabe if (Fehler) throw Fehler;. https://www.npmjs.com/package/mysql#pooling-connections – hpavc

1

Ich bin mit dieser Basisklasse Verbindung mit mysql:

"base.js"

var mysql = require("mysql"); 

var pool = mysql.createPool({ 
    connectionLimit : 10, 
    host: Config.appSettings().database.host, 
    user: Config.appSettings().database.username, 
    password: Config.appSettings().database.password, 
    database: Config.appSettings().database.database 
}); 


var DB = (function() { 

    function _query(query, params, callback) { 
     pool.getConnection(function (err, connection) { 
      if (err) { 
       connection.release(); 
       callback(null, err); 
       throw err; 
      } 

      connection.query(query, params, function (err, rows) { 
       connection.release(); 
       if (!err) { 
        callback(rows); 
       } 
       else { 
        callback(null, err); 
       } 

      }); 

      connection.on('error', function (err) { 
       connection.release(); 
       callback(null, err); 
       throw err; 
      }); 
     }); 
    }; 

    return { 
     query: _query 
    }; 
})(); 

module.exports = DB; 

verwenden Sie es einfach so:

var DB = require('../dal/base.js'); 

DB.query("select * from tasks", null, function (data, error) { 
    callback(data, error); 
}); 
+1

Was Wenn der Fehler "err" der Abfrage wahr ist, sollte er 'callback' nicht mit' null'-Parameter aufrufen, um anzuzeigen, dass ein Fehler in der Abfrage vorliegt? –

+0

Ja, Sie schreiben, Sie müssen den Callback mit dem Abfragefehler aufblasen –

+0

Nice Man sollte aber eine "else" -Konfiguration hinzufügen dition wie folgt: 'if (! err) { Rückruf (Zeilen, err); } sonst {Rückruf (null, err); } sonst könnte Ihre Anwendung hängen. Denn 'connection.on ('error', callback2)' kümmert sich nicht um alle "Fehler". Vielen Dank! – JedatKinports

0

Wenn Sie mit einer Verbindung fertig sind, rufen Sie einfach connection.release() und die Verbindung wird zum Pool, bereit von jemand anderem wieder benutzt werden.

var mysql = require('mysql'); 
var pool = mysql.createPool(...); 

pool.getConnection(function(err, connection) { 
    // Use the connection 
    connection.query('SELECT something FROM sometable', function (error, results, fields) { 
    // And done with the connection. 
    connection.release(); 

    // Handle error after the release. 
    if (error) throw error; 

    // Don't use the connection here, it has been returned to the pool. 
    }); 
}); 

Wenn Sie die Verbindung schließen möchte und aus dem Pool zu entfernen, verwenden Sie stattdessen connection.destroy(). Der Pool erstellt beim nächsten Mal eine neue Verbindung.

Quelle: https://github.com/mysqljs/mysql

Verwandte Themen