2013-08-28 22 views
42

Uygulamamı MySQL'i en verimli şekilde kullanacak şekilde nasıl yapılandıracağımı anlamaya çalışıyorum. Node-mysql modülünü kullanıyorum. Burada Diğer ipler yüzden bennode.js + mysql bağlantı havuzu

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

bu mu databse sorgulamak sonra gerektiren bu modülü mysql sorgulamak ve istediğiniz zaman Şimdi biraz modülü mysql.js

var mysql = require('mysql'); 

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

exports.pool = pool; 

kurmak bağlantı havuzu kullanmak önerdi Iyi bir yaklaşım? Gerçekten de, her şey ana app.js komut dosyasında yapıldığı için çok basit olan mysql bağlantılarını kullanmanın çok fazla örneğini bulamadım. Bu yüzden, kongre/en iyi uygulamaların ne olduğunu gerçekten bilmiyorum.

Her sorgudan sonra mutlaka connection.end() kullanmalı mıyım? Ya onu bir yerlerde unutursam?

Mysql modülümün dışa aktarma kısmının nasıl yeniden yazılacağı, yalnızca bir bağlantı döndürecek şekilde yeniden yazılır, böylece her seferinde getConnection() yazmam gerekmez.

cevap

37

Bu iyi bir yaklaşım.

sadece havuz içinde olduğu bir bağlantısı modülüne aşağıdaki kodu ekleyin almak istiyorsanız: Hala getConnection her zaman yazmak zorunda

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

module.exports = getConnection; 

. Ancak, bağlantıyı ilk aldığınız anda modülde saklayabilirsiniz.

Kullanmayı bittiğinde bağlantıyı sonlandırmak unutmayın:

connection.release(); 
+10

. Şimdi, havuzlar için 'connection.release(); – sdanzig

+0

Bu doğru.Ben değiştirdim. – Klaasvaak

+0

Ayrıca, bir geri çağırma yerine bir söz kullanmanızı öneririm, ama bu sadece bir tercih ... – Spock

10

Bu sarıcı usefull :)

bunu gerektir bulacaksınız, bu gibi kullanmak:

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

Her zaman connection.relase();

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

bununla ilgili bir sorun mu var? – Alex

+3

Bağlantıyı serbest bırakmanız gerektiğini düşünmeyin * önce * – kwhitley

+0

numaralı telefonu sorgulamak için kullanıyorsunuz. Bu kötü bir haber .... bu sürümle aldığınız şeylerin async doğasının bir yan etkisi. Biraz gecikme eklerseniz, bu sorguyu görmezsiniz. Desen ... pool.getConnection (işlev (err, bağlantı) { // Bağlantıyı kullanın connection.query ('SELECT some some some', function (error, results, fields) { // Ve bağlantısı ile yapılır connection.release();. // Sap hata yayımlanmasından sonra eğer (hata) atış hatası;. https://www.npmjs.com/package/mysql#pooling-connections – hpavc

1

gibi pool.getconnetion sonra mysql ile bu temel sınıf bağlantısını kullanıyorum:

"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; 

Aynen böyle kullanılır:

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

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

neler Sorunun 'err' doğruysa? Sorguda bir hata olduğunu göstermek için' null' parametresiyle 'callback' çağrısı yapmamalı mıyım? –

+0

Evet, yazdığınız sorguyu, hata ile birlikte geri çağırmak gerekiyor –

+0

Nice Ama sen bir 'else' con eklemelisin dition şöyle: 'if (! err) { geri arama (satır, err); } else {callback (null, err); } 'uygulamanız askıda kalabilir. Çünkü 'connection.on' ('error', callback2) 'tüm" hatalar "ile ilgilenmeyecektir. Teşekkürler! – JedatKinports

0

Bağlantı tamamlandığında, connection.release() numaralı telefonu arayın ve bağlantı havuza geri dönecektir, hazır Bir başkası tarafından tekrar kullanılmak üzere.

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

Bağlantıyı kapatmak ve havuz çıkarın, yerine connection.destroy() kullanmak istiyorsanız

. Havuz, bir daha ihtiyaç duyulduğunda yeni bir bağlantı kuracaktır.

Kaynak: Sadece bir kafaları yukarı https://github.com/mysqljs/mysql

İlgili konular