Development/DB & SQL

[DB] Connection Pool

이쥬딩 2020. 9. 29. 12:03
728x90

# Connection Pool이란?

데이터베이스에 대한 향후 요청이 필요할 때 연결을 재사용할 수 있도록 유지 관리하는 데이터베이스 연결의 캐시다.

쉽게 말해서 다른 사용자가 다시 사용할 수 있도록 데이터베이스 연결을 열린 상태로 유지하는 데 사용되는 방법으로, DB와 연결된 Connection을 미리 만들어서 pool 속에 저장해 두고 있다가 필요할 때 Connection을 Pool에서 쓰고 다시 Pool에 반환한다.

 

DB와 Connection하는 작업은 네트워크 세션을 열고, 인증하고, 인증을 확인하는 등의 작업을 수행해야 하므로, 비용이 많이 들고, 리소스를 낭비한다.

이 작업을 DB 접근요청이 들어올때 마다 매번 한다고 생각하면 서버에 부하도 많이 갈 것이다.

 

따라서, Connection Pool을 사용하면 한번 연결한 정보를 재사용 가능하니 비용이 적어지고, 리소스 낭비를 방지할수있으며 DB Connection하는데 걸리는 시간도 줄일 수 있다.

# 코드로 이해하기

필자는 NodeJS에서 MSSQL을 Connection 하였다.

아래 dbConnection함수는 함수를 실행하면 실행 할때마다 DB Connection을 하므로, 서버에 부하를 줄 것이다.

import sql from "mssql";

const config = {
    user: "a",
    password: "aa",
    server: "aaa",
    database: "aaaa",
};

const dbConnection = async () => {
    await sql.connect(config, function (err) {
        if (err) return console.error("error is", err);

        const request = new sql.Request();
        request.query("SELECT TOP 1 * FROM ORDR", function (err, recordset) {
            if (err) console.log(err);

            console.log(recordset);
        });
    });
};

dbConnection();

아래 코드는 위에 있는 코드를 Connection Pool을 사용해서 변경한 코드이다.

db.js파일에서 connection pool을 사용하여 global connection을 생성하고 export 하였다.

db.js

import sql from "mssql";

const config = {
    user: "a",
    password: "aa",
    server: "aaa",
    database: "aaaa",
};

const poolPromise = new sql.ConnectionPool(config)
    .connect()
    .then((pool) => {
        console.log("Connected to MSSQL");
        return pool;
    })
    .catch((err) => console.log("Database Connection Failed! Bad Config: ", err));

module.exports = {
    sql,
    poolPromise,
};

app.js파일에서 db.js파일에서 생성해둔 db connection을 import하여 사용하였다. 

queryDatabase함수를 실행할 때마다 connection을 해주지 않아도 되기 때문에 서버에 부하도 줄고, 재사용성도 높일 수 있다.

aap.js

import { poolPromise } from "db.js";

queryDatabase();

async function queryDatabase() {
    const pool = await poolPromise;
    const result = await pool.request().query("SELECT TOP 1 * FROM ORDR", function (err, profileset) {
        if (err) {
            console.log(err);
        } else {
            const send_data = profileset.recordset;
            console.log(send_data);
        }
    });
}

# 참고자료

 


🎉  피드백은 언제나 환영입니다. 🎉


728x90