2017-01-03 18 views
1

今、私はノードJSで非常に大きなアプリケーションを作成しています。私は自分のコードをきれいにして短くしようとしています(ほとんどの開発者のように)。私は自分のjsファイルを作成してmysqlへの接続を処理しています。以下のコードをご覧ください。私はループ私のモデルのメソッドをする関数を作成しようとしていますとき、このコーディングスタイルを使用してノードjs。接続を作成するための適切な/ベストプラクティス

var database = require('../../config/database.js'); 

module.exports.getData = function(successCallBack){ 
    database.query('SAMPLE QUERY GOES HERE', function(err, result){ 
     if(err) {console.log(err)} 
     //My statements here 
    }); 
} 

すべてが正常に動作しますが:

var mysql = require('mysql'); 

var config = { 
    'default' : { 
     connectionLimit : process.env.DB_CONN_LIMIT, 
     host  : process.env.DB_HOST, 
     user  : process.env.DB_USER, 
     password : process.env.DB_PASS, 
     database : process.env.DB_NAME, 
     debug : false, 
     socketPath : process.env.DB_SOCKET 
    } 
}; 

function connectionFunc(query,parameters,callback,configName) { 

    configName = configName || "default"; 

    callback = callback || null; 

    parameters = parameters; 

    if(typeof parameters == 'function'){ 

     callback = parameters; 

     parameters = []; 

    } 
    //console.log("Server is starting to connect to "+configName+" configuration"); 
    var dbConnection = mysql.createConnection(config[configName]); 

    dbConnection.connect(); 

    dbConnection.query(query,parameters, function(err, rows, fields) { 
     //if (!err) 
     callback(err,rows,fields); 
     //else 
     //console.log('Error while performing Query.'); 
    }); 

    dbConnection.end(); 
} 

module.exports.query = connectionFunc; 

私は以下のように、私のモデルでは、上記のファイルを使用しています何らかの理由で。それは私にER_CON_COUNT_ERROR : Too Many Conenctionを与える

for (i = 0; i < 10000; i++) { 
    myModel.getData(param, function(result){    
     return res.json({data : result }); 
    }); 
} 

:下のサンプルを参照してください。問題はなぜ私は接続が常にこのdbConnection.end();によって終了したときにこれらのようなエラーが表示されるのですか?私は何かが欠けているかどうかまだ分かりません。私はまだこれに固執しています。 私の接続制限は100です。私は接続を増やすことは悪い考えです。

+0

接続を使用しようとしています[リンクの説明をここに入力してください](http://stackoverflow.com/questions/18496540/node-js-mysql-connection-pooling)これが役立つことを願って... –

+0

リンクをありがとう。私はすでにそのアプローチを考えてきました。しかし、プールが何らかの理由で破壊されたときに私は問題を抱えています。私のアプリケーションはもう動作しません。 -_-。 –

答えて

0

データベースからのクエリデータが非同期であるため。

ループでは、myModel.getData(またはより正確には下位文字query)は、クエリが終了するまでコードを停止または停止せず、クエリをデータベースサーバーに送信し、データベース応答としてコールバックが呼び出されるとすぐに。

enddbConnectionに接続すると、すぐに接続が切断されることはありません。その接続で作成されたすべてのクエリが終了するとすぐに接続が終了するようにマークされます。正常端()メソッドを呼び出すことによって行われる接続を終了

mysql: Terminating connections

。これにより、以前にエンキューされたすべてのクエリがまだCOM_QUITパケットをMySQLサーバに送信する前に確実に保持されます。

接続を終了する別の方法は、destroy()メソッドを呼び出すことです。これにより、下にあるソケットが即座に終了します。さらに、destroy()は、接続に対してこれ以上イベントやコールバックがトリガーされないことを保証します。

しかし、destroyでは、ライブラリは結果を失うため結果を失います。destroyはめったに役に立ちません。

このコードでは、一度に10000の接続を作成しようとしています。あなたが唯一のタスク、例えばによって接続に使用する必要があります

ユーザーがブラウザを使用してデータを要求する場合は、この要求に対して1つの接続を使用する必要があります。特定の間隔で実行されるタスクがある場合は、タイムドタスクの場合も同じです。ここで

コード例:

var database = require('./config/database.js'); 

function someTask(callback) { 
    var conn = database.getConnection(); 

    myModel.getData(conn, paramsA, dataReceivedA) 

    function dataReceivedA(err, data) { 
     myModel.getData(conn, paramsB, dataReceivedB) 
    } 

    function dataReceivedB(err, data) { 
     conn.end() 
     callback(); 
    } 
} 

あなたは完全にあなたのモデルコード内のデータベース接続を非表示にしたい場合。ここにあなたにヒントを与えることしかできないので、実際にこれだけ多くの要因に依存解決するためにどのように

var conn = myModel.connect(); 
conn.getData(params, function(err, data) { 
    conn.end(); 
}) 

:次に、あなたがそのようなことをDOEする必要があります。

+0

私はあなたの説明に照らされました。私は本当にdatabase.js内のすべてのmysql接続のコードを非表示にしようとしています。あなたが与えた最後の例は実際には得られません。もう少し説明できればと思いますか? –