2017-10-22 18 views
0

MySQLプールがNodeJSアプリケーションからの接続を解放していないようです。 mysqlからサーバープロセスを見ると、接続は確立されていても解放されません。NodeJS Mysql - 接続が解放されていません

アプリは、次のエラーでクラッシュしています:TypeError: Cannot read property 'query' of undefined。私の理解から、これは私が接続の限界を超えたためです。

私はHeroku MySQLプラグインを使用しており、テストには10​​個の接続があります。 .env DB_URLの最後にconnectionLimitを追加してプール内の接続を制限しようとしました。

私.envファイル、リンクはようにフォーマットされて: DEV_DB_URL=mysql://user:[email protected]:3306/db_name?connectionLimit=5 db.jsファイル:

var mysql = require('mysql'); 
var dbURL = process.env.PRODUCTION === 'true' 
    ? process.env.LIVE_DB_URL 
    : process.env.DEV_DB_URL; 

var dbConnection = function dbConnection(sql, values, next){ 

    // It means that the values hasn't been passed 
    if (arguments.length === 2){ 
    next = values; 
    values = null; 
    } 

    var pool = mysql.createPool(dbURL); 
    pool.getConnection(function(err, connection){ 
    connection.query(sql, values, function(err) { 

     connection.release(); 

     if (err) { 
     throw err; 
     } 

     // Execute the callback 
     next.apply(this, arguments); 
    }); 
    }); 
}; 


module.exports = dbConnection; 

db.jsファイルを使用して私のコントローラは次のようになります。

var DB = require('../services/db'); 
exports.updateReporting = function(req, res){ 
    var body = req.body; 
    var sentStatus = body.edc; 


    if(sentStatus === 'pass'){ 
    res.status(200) 
     .send({ 
     message: 'EDC is all good.' 
     }) 
    } 


    if(sentStatus === 'fail'){ 
    var dateTime = require('node-datetime'); 
    var dt = dateTime.create(); 
    var curTimestamp = dt.format('Y-m-d H:M:S'); 

    var storeId = body.store_id 
     .substring('Addr1='.length); 
    var fileTimestamp = body.file_ts; 

    var data = { 
     status: sentStatus, 
     store_id: storeId, 
     file_ts: fileTimestamp, 
     current_ts: curTimestamp 
    }; 


    DB('INSERT INTO edc_reporting SET ?', data, function(err, row){ 
     if (err) throw err; 
    }); 

    res.status(200) 
     .send({ 
     message: 'Message recorded.' 
     }) 
    } 

}; 

私はノードに新しいので、connection.release()が間違った場所にあり、コールバックのために実行されていないかどうかわかりませんか?

何か指摘していただければ幸いです。

答えて

0

これは本当にばかげた過ちでした。

db.jsファイルには、var pool = mysql.createPool(dbURL);がありました。エクスポートされた機能です。これは間違っています。

リクエストが発生するたびに、接続が再作成され、新しいプールが開始されました。この問題を解決するために、dbConnection関数の外部にプールの作成を移動したため、プールが1つしか作成されず、接続が開始されました。

関連する問題