2013-08-28 62 views
42

Tôi đang cố gắng tìm ra cách cấu trúc ứng dụng của mình để sử dụng MySQL theo cách hiệu quả nhất. Tôi đang sử dụng module-mysql module. chủ đề khác ở đây đề nghị sử dụng kết nối tổng hợp vì vậy tôi thiết lập một chút mô-đun mysql.jsnode.js + kết nối mysql pooling

var mysql = require('mysql'); 

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

exports.pool = pool; 

Bây giờ bất cứ khi nào tôi muốn truy vấn mysql tôi yêu cầu mô-đun này và sau đó truy vấn 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); 
     }) 
    }) 
} 

Đây có phải là cách tiếp cận tốt? Tôi thực sự không thể tìm thấy quá nhiều ví dụ về việc sử dụng các kết nối mysql bên cạnh một kết nối đơn giản, nơi mọi thứ được thực hiện trong kịch bản app.js chính vì vậy tôi không thực sự biết quy ước/thực tiễn tốt nhất là gì.

Tôi có nên luôn sử dụng connection.end() sau mỗi truy vấn không? Nếu tôi quên nó ở đâu thì sao?

Làm thế nào để viết lại phần xuất khẩu của mô-đun mysql của tôi để chỉ trả về kết nối vì vậy tôi không phải viết getConnection() mỗi lần?

Trả lời

37

Đó là một cách tiếp cận tốt.

Nếu bạn chỉ muốn có được một kết nối thêm đoạn mã sau vào mô-đun của bạn, nơi các hồ bơi là trong:

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

module.exports = getConnection; 

Bạn vẫn phải viết getConnection mỗi lần. Nhưng bạn có thể lưu kết nối trong mô-đun trong lần đầu tiên bạn nhận được.

Đừng quên để ngắt kết nối khi bạn đang sử dụng xong:

connection.release(); 
+10

Chỉ cần một người đứng đầu lên. Đó là 'connection.release();' bây giờ, cho các hồ bơi. – sdanzig

+0

Đúng vậy.Tôi đã thay đổi nó. – Klaasvaak

+0

Ngoài ra, nếu tôi có thể, tôi sẽ đề nghị sử dụng một lời hứa thay vì gọi lại, nhưng đó chỉ là một sở thích ... giải pháp tuyệt vời Tuy nhiên – Spock

10

Bạn sẽ tìm thấy điều này hữu ích wrapper :)

Yêu cầu nó, sử dụng nó như thế này:

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

tôi luôn sử dụng connection.relase(); sau pool.getconnetion như

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

bất cứ điều gì sai với điều này ?? – Alex

+3

Đừng nghĩ rằng bạn nên phát hành kết nối * trước * bạn sử dụng nó để truy vấn – kwhitley

+0

Vâng, đây là tin xấu .... đó là một tác dụng phụ của bản chất không đồng bộ của những thứ bạn đang nhận được với bản phát hành này. Nếu bạn giới thiệu một số thời gian chờ, bạn sẽ không thấy truy vấn đó. Mẫu là ... pool.getConnection (chức năng (err, kết nối) { // Sử dụng kết nối connection.query ('SELECT something FROM sometable', chức năng (lỗi, kết quả, trường) { // Và được thực hiện với kết nối connection.release(); // Xử lý lỗi sau khi phát hành nếu lỗi (lỗi) ném; https://www.npmjs.com/package/mysql#pooling-connections – hpavc

1

Tôi đang sử dụng kết nối này lớp cơ sở với 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; 

Chỉ cần sử dụng nó như thế:

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

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

Điều gì nếu truy vấn 'err' là true? nó không nên gọi' callback' với tham số 'null' để chỉ ra có một số lỗi trong truy vấn? –

+0

Vâng, bạn viết, cần phải bong bóng gọi lại với lỗi truy vấn –

+0

Nice Nhưng bạn nên thêm một con 'else' dition như thế này: 'if (! err) { gọi lại (hàng, err); } else {callback (null, err); } 'khác ứng dụng của bạn có thể bị treo. Bởi vì 'connection.on ('error', callback2)' sẽ không xử lý tất cả các lỗi "". Cảm ơn! – JedatKinports

0

Khi bạn kết nối xong, chỉ cần gọi connection.release() và kết nối sẽ trở lại hồ bơi, sẵn sàng được một người khác sử dụng lại.

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

Nếu bạn muốn đóng kết nối và xóa kết nối khỏi hồ bơi, hãy sử dụng connection.destroy() để thay thế. Các hồ bơi sẽ tạo ra một kết nối mới trong thời gian tới là cần thiết.

Nguồn: https://github.com/mysqljs/mysql