아 그거 뭐였지

[Express] mysql code: 'ECONNRESET' , errno -4077 에러 본문

Back-End

[Express] mysql code: 'ECONNRESET' , errno -4077 에러

승발자 2022. 9. 30. 21:55
728x90
반응형

서버 레거시 코드를 인계받고 작업하던 도중 알수없는 에러가 났다.

검색을해봐도 확실하게 해결한 사람은 없었고 에러코드도 전부 달랐다.

너무 많은 요청을 하면 발생할수있다고 하는데 코드에서 요청한것이라곤 select문 한번이였다.

코드를 살펴보고 내가 생각했던 문제점들과 해결방법들을 적어보겠다.

문제점

오랜시간동안 connection유지

별별 방법을 시도해봤는데 결론은 connection을 반납하지 않아서 생긴 문제같았다.

그리고 기존의 코드는 클라이언트 요청이 있을때마다 connection을 하고 다시 요청하면 새롭게 connection을 하는 방식이였다.

또한, connection을 하고나서는 해당 연결을 끊거나 반납하지 않았다. 웹 크롤링을 하기때문에

코드특성상 오랜시간이 걸린다. 중복 체크를 위해 db데이터를 크롤링 하기전에 한번 쿼리하는데

이때 connection을 끊지않고 크롤링을 진행해서 타임아웃이 되지않았나싶다.

 

해결방법

connectionPool 사용

이러한 방식이 비효율적이라고 생각해서 cunnectionPool방식으로 변경하였다.

사용을하고난후 성공이거나 실패시 바로 release로 connection을 반납하였더니 해당 오류가 사라졌다.

 

mysql2, connectionPool 사용

async/await를 사용하기 위해서 mysql2라이브러리를 사용하였다.

설치가 안되어있다면 아래 명령어로 설치를 먼저 하자.

npm i mysql2

 

사용하고자 하는 파일에 import해주고 pool을 이용하였다.

const express = require('express');
const mysql = require('mysql2/promise');

import { CONFIG } from "../config";

const pool = mysql.createPool({
    host: CONFIG.DB_HOST,
    user: CONFIG.DB_USER,
    password: CONFIG.DB_PASSWORD,
    database: CONFIG.DB_DATABASE,
    port: CONFIG.DB_PORT,
    ssl: {
        rejectUnauthorized: false
    }
});

export const query = async(query,values?) => {
    const connection = await pool.getConnection(async (conn) => conn)
    try{
        let [rows, fields] = await connection.query(query, values? values : []);
        await connection.release();
        return rows;
    }
    catch(e){
        console.log(e);
        connection.release();
    }
};

 

에러 끝~

쿼리가 성공하거나 실패하였을시 해당 connection을 반납하게 하였다. 이렇게 코드를 수정한뒤 에러가 나지않았다.

혹시나 저 에러가 발생한다면 제때제때 connection을 잘 반납하고있는지 확인해보자.

728x90
반응형
Comments