[Node.js] 1개 노드 서버에서 MSSQL 서버 2개 연결하기
Nodejs로 API 서버 구현 중 MSSQL을 사용한다.
2개의 다른 MSSQL 서버와 연결하여 데이터를 활용하려 한다.
* 아래 코드는 테스트를 위해 임시로 만든 코드이다.
문제 : 아래와 같이 2개 MSSQL 서버 속성을 다르게 설정하고, mssql 모듈을 2번 불러와 사용하려 했는데,
최초 연결한 DB 서버가 pool에 들어가 있어서 인지, 다른 속성으로 Connect를 시도하여도
이미 pool이 생성되어있던 DB서버에 쿼리를 날려버린다.
// db.js
let conf = require(./conf);
const msdb1 = require('mssql');
const msdb2 = require('mssql');
module.exports = {
async dbtest1() {
return (await msdb1.connect(conf.db1)).request()
.input('NM_ID', msdb1.NVarChar, 'test_id1')
.input('RMK', msdb1.NVarChar, 'TEST Remark1')
.query(`insert into tb_logs (NM_ID, RMK) values (@NM_ID, @RMK)`);
}
async dbtest2() {
return (await msdb2.connect(conf.db2)).request()
.input('NM_ID', msdb2.NVarChar, 'test_id2')
.input('RMK', msdb2.NVarChar, 'TEST Remark2')
.query(`insert into tb_logs (NM_ID, RMK) values (@NM_ID, @RMK)`);
}
}
해결 방안 : 스택 오버플로우에 답변을 올려주신 분이 있어서, 해당 코드를 참고하였다. (매우 감사한 분이다.)
GetCreateIfNotExistPool 함수명이 싫어서 기존과 동일한 connect 로 함수를 변경하여 사용했다.
1. 여러 MSSQL DB의 커넥션 풀을 관리하는 mssql-connection-pooling.js 파일을 하나 만든다.
- 이 파일에서는 여러 MSSQL DB의 커넥션 풀을 pools 객체에 넣어관리한다.
config 객체를 문자열로 만든 뒤 key로 사용한다.
connection을 요청할 때 동일한 key가 있다면 pools에서 해당 pool을 제공한다.
동일한 key가 없으면 새로운 pool을 연결하여 pools 에 새로 넣어놓고 pool을 제공한다.
2. mssql-connection-pooling.js 파일을 기존 코드에 불러와 사용한다.
// mssql-connection-pooling.js 파일 코드
const { ConnectionPool } = require('mssql');
const pools = {};
// 새로운 커넥션 풀 생성
function CreatePool(config) {
let key = JSON.stringify(config);
if (GetPool(key)) {
throw new Error('Pool already exists');
}
pools[key] = (new ConnectionPool(config)).connect();
return pools[key];
}
// pools 안에 생성된 connection pool 받기
function GetPool(name) {
if (pools[name]) {
return pools[name];
} else {
return null;
}
}
// pool이 생서되어 있으면 return pool, 없으면 새로 생성
function connect(config) {
let key = JSON.stringify(config);
let pool = GetPool(key);
if (pool) {
return pool;
} else {
return CreatePool(config);
}
}
function ClosePool(config) {
let key = JSON.stringify(config);
if (pools[key]) {
const pool = pools[key];
delete pools[key];
pool.close();
return true;
}
return false;
}
// 모든 pool 종료
function CloseAllPools() {
pools.forEach((pool) => {
pool.close();
});
pools = {};
return true;
}
module.exports = {
ClosePool,
CloseAllPools,
CreatePool,
GetPool,
connect,
}
// db.js //수정본
let conf = require(./conf);
const msdb = require('mssql');
const mssql = require('./mssql-connection-pooling.js')
//const msdb1 = require('mssql');
//const msdb2 = require('mssql');
module.exports = {
async dbtest1() {
return (await mssql.connect(conf.db1)).request()
.input('NM_ID', mssql.NVarChar, 'test_id1')
.input('RMK', mssql.NVarChar, 'TEST Remark1')
.query(`insert into tb_logs (NM_ID, RMK) values (@NM_ID, @RMK)`);
}
async dbtest2() {
return (await mssql.connect(conf.db2)).request()
.input('NM_ID', mssql.NVarChar, 'test_id2')
.input('RMK', mssql.NVarChar, 'TEST Remark2')
.query(`insert into tb_logs (NM_ID, RMK) values (@NM_ID, @RMK)`);
}
}
Node.js mssql multiple concurrent connections to SQL servers interfering with each other
I am using mssql in my Node.js express application to make connections to many different databases across many different SQL servers. I have constructed the following example to demonstrate the gen...
stackoverflow.com