만자의 개발일지

[Node.js] MySQL 쿼리 전송 안되는 문제 해결 방법(feat. Connection Pool ) 본문

Node.js

[Node.js] MySQL 쿼리 전송 안되는 문제 해결 방법(feat. Connection Pool )

박만자 2022. 3. 30. 08:12

개요

개인적으로 프로젝트를 진행하던게 있었는데, 이상하게 서버로 5~8번 이상 요청을 보내면 데이터는 가는데 DB로 쿼리가 안보내지는 현상이 일어났다. 그래서 코드를 하나하나 뜯어보면서 곰곰히 생각해보니 DB에 쿼리를 보낼 때 마다 Connection을 가져오는데, 요청을 다 보낸후에 ConnectionPool에다 반납하지 않고 계속 가지고 있어서 생긴 문제였다.

 

그래서 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()
    })
}

 

 

참고

Comments