본문 바로가기
프로그래밍/database

[220216] DB와 서버를 연결해주는 Connection Pool

by 한코코 2022. 2. 21.

DB와 연결되어있는지 체크하는 코드

SHOW STATUS LIKE 'Threads_connected';

너무 연결이 많이 되면 터짐.

 

그래서 사용하지 않으면 컴퓨터 자원(로직?)을 반환하기 위해 연결을 끊는 종료코드가 존재함.

//연결 샘플 코드
const mysql = require('mysql')

// 연결 생성
let connection = mysql.createConnection({
    host:'127.0.0.1',
    user:'hancoco',
    password:'0000',
    database:'sample'
})

// 연결시작
connection.connect((err)=>{
    if (err) throw err; //  여기 함수종료
    console.log('socket open') // 실행됨.
})

// 보낼 쿼리 내용
connection.query('update User set lastlogin=now() where uid=?', ['user1'], function (error, results, fields) {
    if (error) throw error;
    console.log(results[0])

})

// 할 일 끝났으니 연결 끊기
connection.end()

 

 

Connection Pool

초기에는 커넥션을 위해 연결,반환,끊기-를 반복하는 비효율적인 과정이었으나,

나중엔 커넥션을 미리 맺어놓고 가져다쓰는 커넥션 쿼리 방법을 고안해냄. 이게 Connectin Pool이다.

 

connection : 가져온다.

Connectin Pool에는 2개의 인자값이 들어간다 : SQL구문과 익명함수.

익명함수에는 2개의 매개변수가 들어간다 : error, connection

//connection pool sample code
const mysql = require('mysql')

const pool = mysql.createPool({
    host:'127.0.0.1',
    user:'hancoco',
    password:'0000',
    database:'sample',
    connectionLimit:5 //최대 연결 수
})

pool.getConnection((error,connection)=>{
    connection.query('select * from board',(error,result)=>{
        if(!error){
            //result
            console.log(result)
            connection.release() //connection 반환
        } else {
            //에러가 있을 경우
            throw error //에러를 던짐
        }
    })
    // pool.releaseConnection(connection)
})

 

 

 

MySQL에서 Connection Pool을 사용하는 장점

MS SQL(SQL Server)나 Oracle과 같은 유료 DBMS는 타임아웃이란 개념이 존재한다. 단순하게 말하자면 이러한 타임아웃은 Connection을 자동으로 release(접속종료)해주는 것을 의미하는데, 무료 DBMS인 MySQL은 기본적으로 이러한 Connection을 자동으로 release 해주지 않는다. 하지만 MySQL에서 Connection Pool을 사용하면 다음과 같은 형태로 Auto Release를 지원한다. 

( 참조 블로그 : https://cotak.tistory.com/105 )

pool.query() = pool.getConnection() + connection.query() + connection.release()

 

 

 

비동기적으로 사용하는 Connection Pool

비동기적으로 사용하면 promise를 응답으로 받게 된다.

promise 응답을 받기 위해서 async/await이나 .then을 사용할 수 있다.

( 참고 블로그 : https://velog.io/@kaitlin_k/DBconnection-pool )

( mysql2 공식 사이트 : https://www.npmjs.com/package/mysql2 )

require("dotenv").config();
const mysql = require("mysql2/promise");

const host = process.env.DB_HOST || "localhost";
const user = process.env.user || "hancoco";
const password = process.env.password || "0000";
const database = process.env.database || "study_connectWeb3";

const config = { host, user, password, database, connectionLimit: 5 };
const pool = mysql.createPool(config);
// promise pool을 리턴시켜 controller에서 db를 가져와서 사용할때
// .then, .catch, async/await를 사용할 수 있다

const promisePool = pool.promise();
exports.pool = promisePool;

 

 

 

환경 변수 파일, 명령어 변수

echo : 출력문

변수를 출력할때 앞에 $붙음. 이거 안 붙이면 그냥 string이랑 다를게 없음. 예) echo $PATH : 변수 PATH값 출력

자주 쓰는 주소를 변수에 저장해놓고 꺼내씀. 그래서 이름이 path임. 뭔가 설치하면 경로 다 뜸.

 

env

환경변수를 한 곳에 담지 않고 파일에 담아서 사용할 수 있게끔 함.

라이브러리니까 설치해줘야함. npm install dotenv

project 최상위폴더에 .env 파일 생성 -> 환경변수를 굳이 설정하지 않아도 dotenv 파일이 대신 해주게끔 해준다.

실제로 배포할때는 환경변수를 사용하면 된다.

개발환경 내 컴퓨터에서는 환경변수를 사용하면 된다.

 

process.env

현 운영체제의 환경변수를 가져올 수 있다.

댓글