2013-08-28 2 views
42

MySQL을 가장 효율적으로 사용하도록 애플리케이션을 구조화하는 방법을 알아 내려고하고 있습니다. 나는 node-mysql 모듈을 사용하고있다. 여기에 다른 스레드 그래서 내가node.js + mysql connection pooling

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); 
     }) 
    }) 
} 

이를 수있는, 데이타베이스를 조회 한 후 내가 요구하는이 모듈을 MySQL의를 조회 할 때마다 이제 조금 모듈 mysql.js

var mysql = require('mysql'); 

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

exports.pool = pool; 

을 설정 연결 풀링을 사용하도록 제안 좋은 접근법? 정말 모든 관행이 기본 app.js 스크립트에서 수행되는 매우 단순한 것 외에도 mysql 연결을 사용하는 예제를 너무 많이 찾을 수 없으므로 컨벤션/모범 사례가 실제로 무엇인지 알 수 없습니다.

각 쿼리 후에 항상 connection.end()를 사용해야합니까? 어딘가에서 그걸 잊어 버리면 어떡하지?

매번 getConnection()을 쓸 필요가 없도록 mysql 모듈의 내보내기 부분을 다시 연결하여 반환하는 방법은 무엇입니까?

답변

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', 함수 (오류, 결과, 필드) { // 그리고 연결하여 수행 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'가 true 인 경우 쿼리에 오류가 있음을 나타내는'null' 매개 변수가있는'callback'을 호출하면 안됩니까? –

+0

예, 쿼리 오류로 콜백을 작성해야합니다. –

+0

니스 하나.하지만 당신은'else'를 추가해야합니다. 이 같은 dition :'if (! err) { callback (rows, 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

관련 문제