Node.js
[Node.js] MySQL 쿼리 전송 안되는 문제 해결 방법(feat. Connection Pool )
박만자
2022. 3. 30. 08:12
개요
개인적으로 프로젝트를 진행하던게 있었는데, 이상하게 서버로 5~8번 이상 요청을 보내면 데이터는 가는데 DB로 쿼리가 안보내지는 현상이 일어났다. 그래서 코드를 하나하나 뜯어보면서 곰곰히 생각해보니 DB에 쿼리를 보낼 때 마다 Connection을 가져오는데, 요청을 다 보낸후에 Connection을 Pool에다 반납하지 않고 계속 가지고 있어서 생긴 문제였다.
그래서 Connection Pool이 뭔데?
DB에 연결할 수 있는 Connection을 미리 만들어 Pool이라는 공간에 저장해두었다가 필요할 때 Connection을 가져다 쓴 후, 다시 Pool에다가 반납하는 개념이다.
근데 반납을 안했다
해결 방법
기존에 다음과 같이 사용하고 있었다.
함수를 호출하면 Connection을 가져다 쓰고 반납을 하지 않는 구조로 구현했었다.
const mysql = require('mysql')
var pool = mysql.createPool({
host: 'host',
user: 'user',
password: 'password',
database: 'database'
})
function executeQuery(sql, objects=[]) {
pool.getConnection((err, connection) => {
if(err)
throw err
connection.query(sql, objects,
(error) => {
if (error)
throw error
})
})
}
그래서 connectionLimit도 50으로 늘려주고 무엇보다도 connection.release() 함수를 호출하여 Pool에다 Connection을 반납해주도록 바꿨다.
const mysql = require('mysql')
mysql.createPool({
host: 'host',
user: 'user',
password: 'password',
database: 'database',
connectionLimit: 50
})
function executeQuery(sql, objects=[]) {
pool.getConnection((err, connection) => {
if(err)
throw err
connection.query(sql, objects,
(error) => {
if (error)
throw error
})
connection.release()
})
}
참고