关于nodejs mysql 多次createpool的疑问

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于nodejs mysql 多次createpool的疑问相关的知识,希望对你有一定的参考价值。

刚学nodejs,看到myql连接池,网上都是直接createpool,感觉有问题,感觉他们都用错了。
如果在每个请求时都createpool,那么是不是有多个pool同时存在?如果是,那创建连接池也就没什么多大意义了,顶多在单次请求中多次查询的情况下才有一点意义?如果不是,始终只有一个pool存在,那pool被维护在哪里?global内存中?
我的想法是,在createServer时(服务启动)创建连接池,最后把pool放在global全局对象上,这种用法才是对的?
工作原因没有太多时间去看源码和试验,望大神解答

参考技术A 不是,因为你一个页面现在就是你一个人在用,上纲上线了多人在用,这里连接池是为多人使用的。追问

你没明白我的问题,我问题的是:每个请求都调用createpool会不会有问题,如果没有问题,请告诉我pool的数据被维护在哪里

关于nodejs访问mysql的思考

nodejs要访问mysql数据库,首先必须要安装包mysql,命令:npm install mysql。安装成功后的访问数据库代码如下:

var mysql = require(‘mysql‘);
var options = {
    host: ‘172.23.88.107‘,
    port: 3306,
    database: ‘test‘,
    user: ‘root‘,
    password: ‘zdsoft‘
};

var pool = mysql.createPool(options);

pool.getConnection(function (err, conn) {
    if (err) {
        console.log(err);//打印错误消息
    } else {
        conn.query("select * from student", null, function (err, results, fields) {
            //释放连接
            conn.release();

            if (err) {
                console.log(err);
            } else {
                console.log(results);//成功,打印结果集
            }
        })
    }
});

 

ok,上面的代码经过测试是没有任何问题的,但是现在就有个问题了,我们每次访问数据库都写这么大一篇感觉太累了,于是我们想把公共的部分提取出来创建一个类,文件名为:sqlHelper.js。由于数据库访问是异步访问的,因此我们不能直接通过返回return的方式,因此就必须要使用回调函数,sqlHelper.js的代码如下:

var mysql = require(‘mysql‘);
var options = {
    host: ‘172.23.88.107‘,
    port: 3306,
    database: ‘test‘,
    user: ‘root‘,
    password: ‘zdsoft‘
};

var pool = mysql.createPool(options);

exports.query = function (sql, vals, fn) {
    pool.getConnection(function (err, conn) {
        if (err) {
            fn(new Error(err));
        } else {
            conn.query(sql, null, function (err, results, fields) {
                //释放连接
                conn.release();

                if (err) {
                    fn(new Error(err));
                } else {
                    fn(null, results, fields);
                }
            })
        }
    });
}

 

这样,我们在调用的时候直接传入fn这个回调函数即可,调用方法如下:

var mysql = require(‘./lib/sqlHelper.js‘);//sqlHelper.js文件在lib文件夹下面

var result = mysql.query("select * from student", null, function (err, results, fields) {
    if (results) {
        for (let index = 0; index < results.length; index++) {
            console.log(results[index].name);
        }
    } else {
        console.log("err,msg:" + err);
    }
});

 

自此,我们也算是大功告成了。

================================================分割线===========================================================

然而,我们还有另外一种实现方式,就是通过Promise这个对象,通过Promise对象我们可以像编写同步程序一样去编写异步代码,从而不用去无限次的嵌套回调函数,sqlHelper.js修改如下:

var mysql = require(‘mysql‘);
var options = {
    host: ‘172.23.88.107‘,
    port: 3306,
    database: ‘test‘,
    user: ‘root‘,
    password: ‘zdsoft‘
};

var pool = mysql.createPool(options);

exports.query = function (sql) {
    return new Promise(function (resolve, reject) {
        pool.getConnection(function (err, conn) {
            if (err) {
                reject(err);//让状态变为已失效,并把错误消息传递回去
            } else {
                conn.query(sql, null, function (err, results, fields) {
                    //释放连接
                    conn.release();

                    if (err) {
                        reject(err);
                    } else {
                        resolve(results, fields);//让状态变为已成功,并把成功数据传递回去
                    }
                })
            }
        });
    });
}

 

调用方法修改如下:

var mysql = require(‘./lib/sqlHelper.js‘);//sqlHelper.js文件在lib文件夹下面

var promise = mysql.query("select * from student");
promise.then(function (results, fields) {
    for (let index = 0; index < results.length; index++) {
        console.log(results[index].name);
    }
}, function (err) {
    console.log(err);
});

 

可以看到,我们已经没有使用回调函数了。

以上是关于关于nodejs mysql 多次createpool的疑问的主要内容,如果未能解决你的问题,请参考以下文章

nodejs中的单例模式 - 是否需要?

NodeJS+MySQL 而不是 PHP+MySQL。可以吗?

关于 NodeJs 和大数据 [关闭]

Socket IO事件多次触发NodeJS

NodeJS 在多次请求后无限期挂起

关于安装nodejs后npm不是内部或外部命令的解决方法