2017-12-25 1 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(); 
    }) 
}); 
당신은/제어하는 ​​MySQL 서버의 부하를 제한하려면

당신은 connectionLimit를 사용하여 풀의 연결 제한을 정의 할 수 있습니다,이 편리 될 수 있습니다. 당신이 다른 답변에 대한 링크를 제외하고 추가 정보를 제공하지 않는 경우

(자세한 내용은, Pooling connections 참조)

+0

자세한 설명 주셔서 감사합니다! 그래서 당신이 말하는 것은 제가 수영장을 사용할 경우'connection.end()'를 호출하는 것에 대해 걱정할 필요가 없다는 것입니다, 그렇습니까? – hklee93

+0

@ hklee93 아, 미안하지만,'getConnection' 시나리오의 경우, connection.release();를 사용하여 풀로 연결을 해제해야합니다. 그러나 만약 당신이 풀 ('pool.query')에 질의 함수 direclty만을 호출하면'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

은, 그것은 가능성이 주석이며, 링크 된 대답이 속한 문제는 중복 될 수 있습니다. 그 외에도 응용 프로그램에 하나의 연결 만 사용하면 서버에 대한 많은 병렬 요청이있을 경우 성능이 저하됩니다. –

+0

새로운 정보를 제공해 주셔서 감사합니다. 나는 좀 더 풀링을 할 필요가 있다고 생각한다. – hklee93

관련 문제