[DB] Connection Pool
# 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);
}
});
}
# 참고자료