유저 마이페이지에서 GET요청을 보내던 도중 다음과 같은 에러가 발생했다.
문제는 이 에러가 계속해서 발생하는 것이 아니라, 잘 되다가 한 번씩 발생하는 것이었다.
ER_CON_COUNT_ERROR: Too many connections
콘솔창에 출력된 에러 그대로 connection을 너무 많이 만들어준 것이 문제였다. 대체로 트랜잭션 내에서 connection release를 안 해주는 것이 이 에러의 원인이었지만, 나의 경우엔 pool을 생성하는 미들웨어 내에서 에러의 원인이 있었다.
module.exports = {
database(req, res, next) {
const pool = mysql.createPool({...});
res.pool = pool;
next();
},
...
}
나는 위와 같이 미들웨어를 작성했는데, 이렇게 작성하면 매 요청마다 pool을 계속해서 생성하는 문제가 발생했다.
콘솔을 통해 pool이 계속해서 생성되고 있음을 확인할 수 있다.
이를 수정하여 다음과 같이 최초로 요청이 들어올 때만 pool이 생성되도록 했다.
module.exports = {
database() {
let pool = null;
return (req, res, next) => {
if (pool === null) {
pool = mysql.createPool({...});
}
res.pool = pool;
next();
}
},
}
콘솔을 통해 다음과 같이 한 번만 pool이 생성되는 것을 확인할 수 있었다.
Node.js에선 pool을 생성하는 순간에 config내에 선언된 connectionLimit에 따라 일정한 양의 커넥션을 미리 만들어둔다. 따라서 맨 처음 잘못된 코드처럼 매 요청마다 pool을 만들면 connection이 계속해서 만들어지기 때문에 당연히 커넥션 초과 에러가 발생할 수 밖에 없다. 에러가 일정하게 발생하는 것이 아니라, 랜덤하게 발생한 이유는 MySQL에서 지원하는 connection auto release 때문이었다.
'트러블슈팅' 카테고리의 다른 글
[트러블슈팅] Invalid keyPath 에러 (0) | 2021.05.28 |
---|---|
[트러블슈팅] UseEffect에서 clean up이 되지 않을 때 (feat. async) (0) | 2021.05.25 |
[트러블슈팅] Uncaught ReferenceError: kakao is not defined (5) | 2021.04.29 |
[트러블슈팅] mongoose find not working (0) | 2021.03.10 |
[스크랩] 누구나 한 번쯤은 띄워본 JavaScript 에러 TOP 10. (0) | 2021.02.20 |