2013-08-28 29 views
42

私はMySQLを最も効率的な方法で使用するようにアプリケーションを構造化する方法を理解しようとしています。私はnode-mysqlモジュールを使用しています。ここで他のスレッドはので、私はMySQLを照会したいときはほとんどのモジュールmysql.jsnode.js + mysql接続プール

var mysql = require('mysql'); 

var pool = mysql.createPool({ 
    host  : 'localhost', 
    user  : 'root', 
    password : 'root', 
    database : 'guess' 
}); 

exports.pool = pool; 

は今、私はこのモジュールを必要とし、その後

var mysql = require('../db/mysql').pool; 

var test = function(req, res) { 
    mysql.getConnection(function(err, conn){ 
     conn.query("select * from users", function(err, rows) { 
       res.json(rows); 
     }) 
    }) 
} 

はこれですdatabseを照会設定、接続プールを使用することが提案しました良いアプローチ?非常にシンプルなもののほかに、mysql接続を使用する例があまり多くありません。すべてが主要なapp.jsスクリプトで実行されるので、どのような慣例/ベストプラクティスが本当にわかりません。

各クエリの後に常にconnection.end()を使用する必要がありますか?どこかでそれを忘れるとどうなりますか?

mysqlモジュールのエクスポート部分を再接続して接続を返す方法は、毎回getConnection()を書く必要はありませんか?

答えて

37

これは良いアプローチです。

あなただけのプールはである場合、接続があなたのモジュールに次のコードを追加取得したい場合は:あなたはまだのgetConnectionを毎回書く必要が

var getConnection = function(callback) { 
    pool.getConnection(function(err, connection) { 
     callback(err, connection); 
    }); 
}; 

module.exports = getConnection; 

。しかし、初めてモジュールを取得したときにモジュール内の接続を保存することができます。

あなたがそれを使用して行われたときに接続を終了することを忘れないでください:

connection.release(); 
+10

。これはプール用の 'connection.release();'です。 – sdanzig

+0

それは本当です。私はそれを変えた。 – Klaasvaak

+0

さらに、コールバックの代わりに約束を使用することをお勧めしますが、これは単なる設定です...でも、偉大な解決策です。 – Spock

10

あなたはこのラッパー便利:)

がそれを必要とするでしょう、このようにそれを使用します。

db.connection.query("SELECT * FROM `table` WHERE `id` = ? ", row_id) 
      .on('result', function (row) { 
      setData(row); 
      }) 
      .on('error', function (err) { 
      callback({error: true, err: err}); 
      }); 
-2

私は常にconnection.relase()を使用します。

pool.getConnection(function (err, connection) { 
     connection.release(); 
     if (!err) 
     { 
      console.log('*** Mysql Connection established with ', config.database, ' and connected as id ' + connection.threadId); 
      //CHECKING USERNAME EXISTENCE 
      email = receivedValues.email 
      connection.query('SELECT * FROM users WHERE email = ?', [email], 
       function (err, rows) { 
        if (!err) 
        { 
         if (rows.length == 1) 
         { 
          if (bcrypt.compareSync(req.body.password, rows[0].password)) 
          { 
           var alldata = rows; 
           var userid = rows[0].id; 
           var tokendata = (receivedValues, userid); 
           var token = jwt.sign(receivedValues, config.secret, { 
            expiresIn: 1440 * 60 * 30 // expires in 1440 minutes 
           }); 
           console.log("*** Authorised User"); 
           res.json({ 
            "code": 200, 
            "status": "Success", 
            "token": token, 
            "userData": alldata, 
            "message": "Authorised User!" 
           }); 
           logger.info('url=', URL.url, 'Responce=', 'User Signin, username', req.body.email, 'User Id=', rows[0].id); 
           return; 
          } 
          else 
          { 
           console.log("*** Redirecting: Unauthorised User"); 
           res.json({"code": 200, "status": "Fail", "message": "Unauthorised User!"}); 
           logger.error('*** Redirecting: Unauthorised User'); 
           return; 
          } 
         } 
         else 
         { 
          console.error("*** Redirecting: No User found with provided name"); 
          res.json({ 
           "code": 200, 
           "status": "Error", 
           "message": "No User found with provided name" 
          }); 
          logger.error('url=', URL.url, 'No User found with provided name'); 
          return; 
         } 
        } 
        else 
        { 
         console.log("*** Redirecting: Error for selecting user"); 
         res.json({"code": 200, "status": "Error", "message": "Error for selecting user"}); 
         logger.error('url=', URL.url, 'Error for selecting user', req.body.email); 
         return; 
        } 
       }); 
      connection.on('error', function (err) { 
       console.log('*** Redirecting: Error Creating User...'); 
       res.json({"code": 200, "status": "Error", "message": "Error Checking Username Duplicate"}); 
       return; 
      }); 
     } 
     else 
     { 
      Errors.Connection_Error(res); 
     } 
    }); 
+0

何かこれで間違っていますか? – Alex

+3

クエリを使用する前に接続*を解放する必要があるとは思わない – kwhitley

+0

はい、これは悪いニュースです。このリリースでは、非同期的な性質の副作用です。レイテンシを導入すると、そのクエリは表示されません。パターンは... pool.getConnection(function(err、connection){ //接続を使用する connection.query( '何かをsometableから選択する'、function(error、results、fields){ //そして、接続で行わ connection.release();。。リリース後 //エラー処理 (エラー)スローエラーならば、 https://www.npmjs.com/package/mysql#pooling-connections – hpavc

1

ようpool.getconnetion後、私は、MySQLと、このベースクラスの接続を使用しています:

"base.js"

var mysql = require("mysql"); 

var pool = mysql.createPool({ 
    connectionLimit : 10, 
    host: Config.appSettings().database.host, 
    user: Config.appSettings().database.username, 
    password: Config.appSettings().database.password, 
    database: Config.appSettings().database.database 
}); 


var DB = (function() { 

    function _query(query, params, callback) { 
     pool.getConnection(function (err, connection) { 
      if (err) { 
       connection.release(); 
       callback(null, err); 
       throw err; 
      } 

      connection.query(query, params, function (err, rows) { 
       connection.release(); 
       if (!err) { 
        callback(rows); 
       } 
       else { 
        callback(null, err); 
       } 

      }); 

      connection.on('error', function (err) { 
       connection.release(); 
       callback(null, err); 
       throw err; 
      }); 
     }); 
    }; 

    return { 
     query: _query 
    }; 
})(); 

module.exports = DB; 

はちょうどそのようにそれを使用します。

var DB = require('../dal/base.js'); 

DB.query("select * from tasks", null, function (data, error) { 
    callback(data, error); 
}); 
+1

何もしクエリの 'err'が真であれば、' null'パラメータで 'callback'を呼び出して、クエリに何らかのエラーがあることを示してはいけませんか? –

+0

はい、あなたは書き込みエラーを返してコールバックを呼び出す必要があります –

+0

ニースしかし、あなたは 'else'を追加するべきですこのようなdition: 'if(!err){ コールバック(行、エラー); } else {コールバック(null、エラー); } 'アプリケーションがハングする可能性があります。 'connection.on( 'error'、callback2)'はすべての "エラー"を処理しないためです。ありがとう! – JedatKinports

0

接続が完了したら、connection.release()に電話してください。接続はプールに戻ります。他の人によって再び使用されること。

var mysql = require('mysql'); 
var pool = mysql.createPool(...); 

pool.getConnection(function(err, connection) { 
    // Use the connection 
    connection.query('SELECT something FROM sometable', function (error, results, fields) { 
    // And done with the connection. 
    connection.release(); 

    // Handle error after the release. 
    if (error) throw error; 

    // Don't use the connection here, it has been returned to the pool. 
    }); 
}); 

あなたは接続を閉じ、プールから削除し、代わりにconnection.destroy()を使用したい場合。プールは、次回に必要なときに新しい接続を作成します。

出典:ちょうどヘッドアップhttps://github.com/mysqljs/mysql