node.js + mysql连接池

我试图找出如何构build我的应用程序使用MySQL最有效的方式。 我正在使用node-mysql模块。 其他线程build议使用连接池,所以我设置了一个小模块mysql.js

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

现在,每当我想查询MySQL我需要这个模块,然后查询数据库

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

这是好的方法吗? 除了非常简单的一个,其中一切都在主app.js脚本中完成,所以我真的不能find太多的使用mysql连接的例子,所以我真的不知道公约/最佳实践是什么。

我应该每次查询后都使用connection.end()吗? 如果我忘了它在什么地方呢?

如何重写我的mysql模块的出口部分返回一个连接,所以我不必每次都写getConnection()?

这是一个很好的方法。

如果您只想获得连接,请将以下代码添加到您所在的模块中:

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

你每次都必须写getConnection。 但是,您可以在第一次将连接保存到模块中。

当您完成使用时,请不要忘记结束连接:

 connection.release(); 

你会发现这个包装有用:)

 var pool = mysql.createPool(config.db); exports.connection = { query: function () { var queryArgs = Array.prototype.slice.call(arguments), events = [], eventNameIndex = {}; pool.getConnection(function (err, conn) { if (err) { if (eventNameIndex.error) { eventNameIndex.error(); } } if (conn) { var q = conn.query.apply(conn, queryArgs); q.on('end', function () { conn.release(); }); events.forEach(function (args) { q.on.apply(q, args); }); } }); return { on: function (eventName, callback) { events.push(Array.prototype.slice.call(arguments)); eventNameIndex[eventName] = callback; return this; } }; } }; 

要求,像这样使用它:

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

我正在用这个基类与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; 

就这样使用它:

 var DB = require('../dal/base.js'); DB.query("select * from tasks", null, function (data, error) { callback(data, error); }); 

我总是使用connection.relase(); 在pool.getconnetion之后

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