在开发项目时,建立一个数据库连接所消耗的性能成本是比较高的,如果为每一个接收到的客户端请求都建立一个或者多个数据库连接,将会严重降低应用程序的性能,因此,通常需要为多个数据库连接创建并维护一个连接池,当连接不再需要使用时,这些连接可以缓存在连接池中,当接收到下一个客户端请求时,可以从连接池中取出连接并重新利用,而不需要再重新建立数据库连接
在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);//释放连接池,等待别的连接池使用
在开发项目时,建立一个数据库连接所消耗的性能成本是比较高的,如果为每一个接收到的客户端请求都建立一个或者多个数据库连接,将会严重降低应用程序的性能,因此,通常需要为多个数据库连接创建并维护一个连接池,当连接不再需要使用时,这些连接可以缓存在连接池中,当接收到下一个客户端请求时,可以从连接池中取出连接并重新利用,而不需要再重新建立数据库连接在mysql模块中,使用createPool方法创建连接池,在建立了连接池之后,可以直接使用连接池对象的getConnection方法从连接池中获取一个连接,如果连接池中
在开发项目时,建立一个数据库连接所消耗的性能成本是比较高的,如果为每一个接收到的客户端请求都建立一个或者多个数据库连接,将会严重降低应用程序的性能,因此,通常需要为多个数据库连接创建并维护一个连接池,当连接不再需要使用时,这些连接可以缓存在连接池中,当接收到下一个客户端请求时,可以从连接池中取出连接并重新利用,而不需要再重新建立数据库连接
在mysql模块中,使用createPool方法创建连接...
1.什么是mysql连接池
数据库连接池是程序启动时有足够的数量的数据库连接对象,组成的一个池子,由node程序动态调用池子中的对象,进行连接,使用,释放,关闭等操作
2.为什么要使用mysql连接池
为什么要使用mysql连接池,而不是单一的连接mysql,使用就链接,使用完就关闭,这不是挺方便的吗?
恩~~~~ 一开始我也是图方便就参考了网上的代码,使用单一链接mysql的,但是出现了一个问题:就是我连接完之后我关闭了,这个期间,我又一个程序又要执行mysql,但是这个期间另一个程序以为是链接mysql
async.parallel是流程控制里边io并行的控制方法,如果async.parallel里边没有io操作,那么里边的函数执行都是串行的。
这里讨论一下参数接收的问题,上代码:
var async = require('async');
function process1(cb){
var tx1 = {address:'dadada'};
var total1 = 1;...
确实,`layui.upload.render` 方法返回的上传组件实例并没有 `destroy` 方法。如果你需要销毁上传组件实例,可以使用 `delete` 关键字删除该实例的引用,以便在下一次 JavaScript 垃圾回收时自动销毁。例如:
var uploadInst = layui.upload.render({
// 上传组件配置
// 销毁上传组件实例
delete uploadInst;
如果你需要在页面刷新或关闭时手动销毁上传组件实例,可以将上传组件实例存储到一个全局变量中,在需要销毁时遍历该变量并逐个销毁。例如:
// 存储上传组件实例的全局变量
var uploadInstArr = [];
// 初始化上传组件实例并存储到全局变量中
uploadInstArr.push(layui.upload.render({
// 上传组件配置
// 销毁上传组件实例
for (var i = 0; i < uploadInstArr.length; i++) {
delete uploadInstArr[i];
uploadInstArr = [];
希望这能帮助你解决问题。如果你需要更多的帮助,请提供更多的代码和上下文,以便更好地理解问题并提供更准确的帮助。