为什么Node.js中的MySQL如此之慢?

时间:2012-11-26 10:01:50

标签: mysql node.js node-mysql

我的Node.js代码如下所示

CODE1:在

下面
var http=require('http');
var MySQL = require('mysql');

mysql = MySQL.createConnection(...)

http.createServer(function(req, res){
    // the query will take several seconds
    mysql.query("SELECT SLEEP(1)", function....)
});
http.listen(...);

问题是当我刷新页面太快时服务器会崩溃。我认为是node-mysql模块的问题,它在队列中处理查询。所以我尝试创建一个连接池。

CODE2:在

下面
....
var pool = require('generic-pool');
var mp   = pool.Pool({
    ...
    create: function(cb){
        client = MySQL.createConnection(...);
        cb(null, client)
    },
    max: 10, // up to 10 connection
    min: 2,
    ...
});
....
    mp.acquire(function(err, mysql){

        // the query will take several seconds
        mysql.query("SELECT SLEEP(1)", function....)
        mp.release(mysql);
    });
....

但问题还存在,为什么?我该如何解决这个问题。

编辑:我发出100个并发100个请求,预计10秒。但它需要20秒。为什么?该池最多只支持5个连接吗?

2 个答案:

答案 0 :(得分:1)

连接池是处理多个并发请求的好方法。 但是,为什么我们不能使用特定于mysql的池?而不是使用“通用资源池”?

这个link讨论' node-mysql-pool ',它是node.js的MySQL连接池

答案 1 :(得分:1)

免责声明:我编写了模块来解决这类问题。

npm install mysql-simple-pool

现在您可以配置连接池。我最多使用100个连接。

var Pool = require('mysql-simple-pool');
var pool = new Pool(100, {
    host: 'localhost',
    user: 'root',
    password: 'root',
    database: 'test'
});

现在你可以编写一个测试函数来测试它。

function test() {
    var counter = 0;
    var start = new Date().getTime();
    for (var xa = 0; xa < 10; xa++) {
        pool.query('SELECT SLEEP(1)', function(err, results) {
            counter++;
            if (counter == 10) {
                var end = new Date().getTime();
                console.log('Time spend is ' + (end - start) + 'ms');
                test();
            }
        });
    }
}
test();

这是输出......

Time spend is 1044ms
Time spend is 1006ms
Time spend is 1005ms
Time spend is 1006ms
Time spend is 1007ms
Time spend is 1005ms
Time spend is 1005ms
Time spend is 1004ms
Time spend is 1005ms
Time spend is 1005ms

第一次花费一些时间建立连接。希望这有帮助〜