[Node.js] MSSQL 3.x Connection 중첩 해결 방법

2017. 6. 1. 00:32개발/Node.js

반응형

MSSQL Module


Node에서 MSSQL Server와 연결하기 위해서는 npm의 mssql 모듈을 사용해서 연결을 할 수 있다.


이때 3.x 버전을 사용하고 있다면 연결 문제가 발생할 수 있다...


Node.JS가 비동기 방식으로 동작하면서 쿼리 요청을 처리하기 전에 쿼리 요청이 한번 더들어오게되면 connection이 2번 생겨나게 된다...


결국 첫번째 쿼리 또는 두번째 쿼리 둘중 하나만 쿼리 응답이 제대로 될 수가있고, 둘다 안될 수도 있고, 둘다 될수도 있다...


이런 경우 connection이 있다면 connection 시도를 막아줄 수 있도록 수정하면 해결할 수 있다. (100% 효율적인 방법은 아닙니다..)


조금 더 수월한 방안으로 나아 가려면 비동기 방식의 코드보다는 동기 방식의 코드를 사용하는 것이 더 좋다.





해결 방법




1. connection.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var sql = require('mssql');
 
var for_query_connection;
 
function ConnectMsSQL(callback) {
  var connection = new sql.Connection('mssql://유저명:비밀번호@DB서버IP:포트번호/DB이름'function(err) {
    if(err) {
      return callback(err);
    }
    callback(null, connection);
  })
}
 
function runQuery(sqlquery, callback) {
  if(!for_query_connection) {
    ConnectMsSQL(function(err, conn) {
      if(err) {
        return callback(err);
      }
      for_query_connection = conn;
      runQuery(sqlquery,callback);
    })
    return;
  }
 
  var request = new sql.Request(for_query_connection);
  request.query(sqlquery, callback);
}
 
exports.runQuery = runQuery;
 
cs

--> runQuery 함수를 통해 쿼리가 실행되는데 이때 for_query_connection 변수에 connection 객체가 없다면 새로 연결을 시도하고 연결객체가 되어있는 상태라면 연결을 시도하지 않게 된다.



2. 사용하는 부분에서 다음과 같이 호출

1
2
3
4
5
var connection = require('./connection');
 
connectionPool.runQuery('쿼리문'function(err, recordset) {
   // 콜백 함수 내용
})
cs






동기식으로 해결하려면 다음 링크를 참조하면 조금 도움 될거같다..

http://proinlab.com/archives/1811

https://github.com/nhnent/fe.javascript/wiki/October-12---October-16,-2015

http://meetup.toast.com/posts/73





반응형