2017-12-25 17 views
0

私はnodejsを非常に新しくしています。作成しようとしているサービスがあり、mysql接続をそのままconnection.connect()としておくことができないことに気付きました。だから私は接続を継続するこの方法を考案しましたが、これが接続を維持する正しい方法であるかどうかはわかりませんでした。コードの途中でコメント部分を見ている人はいますか?エクスプレスでmysql接続を維持する

app.get('/keyboard', function(req, res){ 
    connection.connect(); 
    connection.query("SELECT `hour` from timetable WHERE `reserved` = '0'", function(err, rows, fields){ 

      if(err) throw err; 
      var buttons = []; 
      for(var i = 0; i < rows.length; i++){ 

        buttons.push(rows[i].hour); 
      } 

      console.log("available time: " + buttons); 

      var return_data = { 

        "type" : "buttons", 
        "buttons" : buttons 
      }; 
      //console.log(return_data); 
      res.send(return_data); 

    }); 

    connection.end(); // connection ends here 
    //connection.connect() doesn't create a new connection. 
    connection = mysql.createConnection({ // another connection like this? 
      host  : 'localhost', 
      user  : 'user', 
      password : 'pw', 
      database : 'db' 
    }); 
}); 

答えて

0

このシナリオでは、mysqlライブラリが提供するプール機能の使用を検討する必要があります。プールは、接続を管理するタスクを引き継ぎます。

var mysql = require('mysql'); 
var pool = mysql.createPool({ // another connection like this? 
    host: 'localhost', 
    user: 'user', 
    password: 'pw', 
    database: 'db', 
    connectionLimit : 10 // its depends on requirement 
}); 


app.get('/keyboard', function(req, res) { 
    pool.query("SELECT `hour` from timetable WHERE `reserved` = '0'", function(err, rows, fields) { 

    if (err) throw err; 

    var buttons = []; 
    for (var i = 0; i < rows.length; i++) { 
     buttons.push(rows[i].hour); 
    } 

    console.log("available time: " + buttons); 

    var return_data = { 

     "type": "buttons", 
     "buttons": buttons 
    }; 
    //console.log(return_data); 
    res.send(return_data); 
    }); 
}) 

あなたは差がmysqlのモジュールは、プールオブジェクトの各呼び出しでそのプールのうち、新たな接続を要求し、クエリが終了した後にその接続を解放することで、通常の接続のようなプールを使用することができます。

これは、接続ごとの使用状況を複数の別の種類で照会する必要がある場合は、トランザクションを使用する必要がある場合に重要です。例えば。このようなものは失敗、または予期しない動作可能性があります:あなたはそのように記述する必要があり、このような場合のために

pool.query("START TRANSACTION") 
pool.query("SELECT ...") // some query 
pool.query("COMMIT") 

を、しかしそこには、使用して戻ってプールへの接続を解放する必要がconnection.release();

pool.getConnection(function(err, connection) { 
    connection.query("START TRANSACTION") 
    pool.query("SELECT ...") // some query 
    connection.query("COMMIT", function() { 
    connection.release(); 
    }) 
}); 

connectionLimitを使用してプールの接続制限を定義することができます。これは、mysqlサーバの負荷を制御/制限する場合に便利です。

(詳細については、Pooling connectionsを参照してください)

+0

詳細な説明をありがとう!だから、あなたが言っているのは、私がプールを使うなら、 'connection.end()'を呼び出す心配はありませんよね? – hklee93

+0

@ hklee93 ah残念ですが、 'getConnection'シナリオでは、' connection.release(); 'を使って接続をプールに戻す必要があります。しかし、クエリ関数direcltyをプール( 'pool.query')だけで呼び出すと、' release'または 'end'を使う必要はありません。 –

+0

ありがとう!私を通り越して試してみましょう – hklee93

0

node-mysql-pool npmモジュールを使用するポーリング方法を使用して接続を作成できます。

var MySQLPool = require("mysql-pool").MySQLPool; 
var pool = new MySQLPool({ 
    poolSize: 4,// it can be number of connections 
    user:  'root', 
    password: 'root', 
    database: 'test' 
}); 

pool.query("SELECT 'Hello, World!' AS hello", function(err, rows, fields) { 
    if(err) throw err; 
    console.log(rows[0].hello); 
}); 

for(var i = 0; i < 10; ++i) { 
    pool.query("SELECT SLEEP(2), ? AS i", [i], function(err, rows, fields) { 
    if(err) throw err; 
    console.log("Slept: " + rows[0].i); 
    }); 
} 
+0

あなたは別の答えへのリンク以外の任意の追加情報を提供していない場合、それは可能性が高いコメントで、リンクされた答えが所属質問が重複している可能性があります。それに加えて、アプリケーションに対して1つの接続のみを使用すると、サーバーに対する多数の並列要求があると、パフォーマンスが低下します。 –

+0

新しい情報をありがとう。私はもう少しプールしてみる必要があると思う。 – hklee93

関連する問題