0

リモートシステムから投稿されたデータを処理するExpress.jsを使用したシンプルなアプリがあります。

基本認証(express.basicAuth)と他のいくつかのモジュール(DB接続プーリング用のgeneric-pool、時間計算用のmoment.js、およびmysql)と、アプリをサービスとして実行するためのForeverがあります。問題が発生した場合に備えて、アプリはSuSe11.2で実行されています。

すべてが約2時間完全に正常に実行されます。データは投稿され、処理され、保存されます。投稿あたり約1kb〜のデータ、1時間あたり80件の投稿。その後、アプリが再起動されるまでアプリは応答しなくなります($永久に再起動します)

私はNodeにまったく慣れていないので、問題をデバッグするために次にどこに行けばよいかわかりません。アプリが応答しなくなったときにアクセスログファイルまたはエラーログファイルに何も書き込まれていません。また、意味のある出力またはスタックトレースを取得する別の方法があるかどうかもわかりません。

アドバイスや指示をいただければ幸いです。

編集:コメントに追加されているように、データは解析され、接続管理にgeneric-poolを使用してMySQLテーブルに直接書き込まれます。

具体的には:

var poolModule = require('generic-pool');
var pool = poolModule.Pool({
    name: 'mysql',
    create: function(cb) {
        var mysql = require('mysql');
        var db = mysql.createConnection({ host: '...', user: '...', 'password: '...' });
        cb(null, db);
    },
    destroy: function(client) { client.end(); },
    max: 10
});

次に、ルーターで:

function(req, res) {
    pool.acquire(function(err,client)) {
        if(err) throw err;

        // ...data parsing / query building


        client.query('...the query...', function(err, rows, fields) {
            pool.release(client);
            if(err) { res.send(err); }
            else { res.send('success'); }
        }
    });
}

Edit2-障害イベントが発生しているようです。その結果、db接続が閉じられません。2つの接続が5分間と15分間開いていることに気付きました。この成長率を考えると、最大接続制限(10)に簡単に到達し、ハングする可能性があります。これが原因かどうかはすぐにわかります!:)

4

2 に答える 2

4

エラーが発生したときに DB 接続が解放されていませんでした。接続制限に達したときに、最終的に到達すると、後続のページ リクエストがハングしました。データ処理とエラー処理を改善した後、問題は解消されました。

于 2013-01-30T16:13:06.673 に答える
0

以下のように db 接続を維持してみてはいかがでしょうか。

setInterval(function(){
    // Run query to retain db connection
    db.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
        if (err) throw err;
    });
}, 60 * 1000);
于 2013-05-31T04:46:16.760 に答える