8

私の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 つの接続しかサポートしていませんか?

4

2 に答える 2

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

初めて接続を確立するのに時間がかかります。これが役立つことを願って〜

于 2013-01-07T22:16:53.743 に答える
1

接続プールは、複数の同時要求を処理するための優れたソリューションです。しかし、「汎用リソース プール」を使用する代わりに、なぜ mysql 固有のプールを使用できないのでしょうか?

このリンクでは、node.js の MySQL 接続プールである「node-mysql-pool 」について説明しています。

于 2012-12-24T05:11:32.070 に答える