node mysql连接池问题connection.release()、connection.destroy()、pool.end()

在开发项目时,建立一个数据库连接所消耗的性能成本是比较高的,如果为每一个接收到的客户端请求都建立一个或者多个数据库连接,将会严重降低应用程序的性能,因此,通常需要为多个数据库连接创建并维护一个连接池,当连接不再需要使用时,这些连接可以缓存在连接池中,当接收到下一个客户端请求时,可以从连接池中取出连接并重新利用,而不需要再重新建立数据库连接

在mysql模块中,使用createPool方法创建连接池,在建立了连接池之后,可以直接使用连接池对象的getConnection方法从连接池中获取一个连接,如果连接池中没有可用连接,将隐式的建立一个数据库连接

1.connection.release() 当一个连接不需要使用时,使用该方法将其归还到连接池中

2.connection.destroy() 当一个连接不需要使用且需要从连接池中移除时,可以使用该方法

3.pool.end() 当一个连接池不需要使用时,可以使用该方法关闭连接池

注意:可以使用createPool方法的属性connectionLimit设置连接池中的最大连接数,默认为10

注明:引用eg:

//创建并使用连接池对象  
var mysql = require('mysql');  
var pool = mysql.createPool({  
    host : 'localhost',  
    port : 3306,  
    database : 'test',  
    user : 'root',  
    password : ''     
})  
pool.getConnection(function(err,connection){  
    if(err){  
        console.log('与mysql数据库建立连接失败');  
    }else{  
        console.log('与mysql数据库建立连接成功');  
        connection.query('select * from admin',function(err,rows){  
            if(err){  
                console.log('查询数据失败');  
            }else{  
                console.log(rows);  
                pool.end();  
            }  
        })  
    }  
})  

项目中应用:eg:
一、connect.js

// 创建连接池
const mysql = require('mysql');
const express = require('express');
const app = express();
const router = express.Router();

// 解析参数
const bodyParser = require('body-parser');
// json请求
app.use(bodyParser.json());
//表单请求
app.use(bodyParser.urlencoded({extended: false}));
/**
 * 配置mysql
 */
const option = {
	host: 'localhost',
	user: 'root',
	password: 'root',
	port: '3306',
	database: 'nodecms',
	connecTimeout: 500,//连接超时
	multipleStatements: false//是否允许一个query中包含多条sql语句
};
let pool;
repool();
function Res ({code = 200, msg = '', data = {}}){
	this.code = code;
	this.msg = msg;
	this.data = data;
};
function resJson (_res, result) {
	return _res.json(new Res(result))
};
//断线重连机制
function repool() {
	//创建连接池
	pool = mysql.createPool({
		...option,
		waitForConnection: true,//当无连接池可用时,等待(true) 还是抛错(false)
		connectionLimit: 100,//连接限制
		queueLimit: 0//最大连接等待数(0为不限制)
	});
	pool.on('error', err => {
		err.code === 'PROTOCOL_CONNECTION_LOST' &&setTimeout(repool, 2000);
	});
	app.all('*', (_,__, next) => {
		pool.getConnection(err => {
			err && setTimeout(repool, 2000) || next();
		});
	});
};
module.exports = {app, pool, router, resJson}

二、
user.js

/**
 * 用户登录功能
 */
router.get('/login', (req, res) => {
	let user = {
		username: req.query.name,
		password: req.query.password
	};
	let _res = res;
	//判断参数是否为空
	if(!user.username) {
		return resJson(_res, {
			code: -1,
			msg: '用户名不能为空'
		});
	}
	if(!user.password) {
		return resJson(_res, {
			code: -1,
			msg: '密码不能为空'
		});
	}
	let _data;
	//从连接池获取连接
	pool.getConnection((err, conn) => {
		conn.query(userSQL.queryByNamePassword, [user.username, user.password], (e, result) => {
			if(e) _data= {
				code: -1,
				msg: e
			}
			// 通过用户名和密码索引查询数据,用数据说明用户存在且密码正确,
			// 只能返回登录成功,否则返回用户不存在或登录密码错误
			if (result && result.length) {
				_data = {
					msg: '登陆成功',
					data: {
						userInfo: {
							usrename: user.username
						}
					}
				}
			} else {
				_data = {
					code: -1,
					msg: '用户名不存在或登录密码错误'
				}
			}
			resJson(_res, _data);
		});
		pool.releaseConnection(conn);//释放连接池,等待别的连接池使用
	});
});

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页