Node.js 에서 mariadb 연결 시 안정적인 방법이 무엇인가요?


node.js + express 환경으로 웹사이트를 개발 중입니다.

sequelize 를 사용하여 디비 부분을 개발하다가, 저는 sql에 익숙해서 sequelize 부분을 모두 제거하여 개발 했습니다.

그런데 데이터베이스 연결이 자꾸 끊어집니다.

제가 생각하기로는,

  1. 약 1분? 이런 식으로 인터벌을 주어 연결을 시도하는 방법
  2. GET 또는 POST 요청 시에 getConnection 하여 연결 하는 방법

정도가 떠오릅니다.

또는 http://berr.tistory.com/222 에서 소개하는 방법으로 connection 이 끊어지는 리스너를 추가하는 방법도 있다고 하네요.

정리하면 db 연결이 자꾸 끊어지는데 이를 해결하고 싶습니다. 실무에서는 어떻게 개발하는지 궁금합니다.

  • 2016년 10월 21일에 작성됨
    웹 사이트 공부 중입니다. 많은 도움 주시면 좋아요.

조회수 145


1 답변


좋아요
1
싫어요
채택취소하기

상용 서비스가능한 수준에서는 어떻게 관리하는지는 잘 모르겠지만

node.js 모듈에 'generic-pool' 이란것이 있습니다.

connection pool을 관리해주는 모듈이니 connection이 끊기는 문제는 해결이 되지않을까 싶네요

mysql 예제 입니다.

db_pooling.js

var generic_pool    = require("generic-pool");
var mysql       = require("mysql");

// local env
config = {
    host:'127.0.0.1',
    user:'username',
    password:'password',
    database:'databasename'
};

var pooling     = generic_pool.Pool({
    name:"mysql",
    create:function(cb){
        var conn = mysql.createConnection(config);
        conn.connect(function(err){
            if( err) console.log("mysql 연결오류");
            else {
            //  console.log("mysql 연결성공");
            }   cb(err, conn);
            // 콜백함수를 통해 풀링에 커넥션 객체를 던짐
        });
    },
    destroy:function(myConn){
        myConn.end(function(err){
            if( err)    console.log("mysql 연결해제오류");
    //      else        console.log("mysql 연결해제성공");
        });
    },
    min:1,
    max:2,
    idleTimeoutMillis:1000*500,
    log:false

});

process.on("exit", function(){
    pooling.drain(function(){
        pooling.destroyAllNow();
    });
});

module.exports = pooling;

pool을 가져다 쓸때는

query_processing.js

var pool = require("./db_pooling");

exports.search = function(cb, param){ // param = request.params
//console.log(param);
    pool.acquire(function(err, conn){
        if (err) console.log("커넥션 획득 실패 " + err);
        else
        {
            conn.query(
                "SELECT * FROM TBL WHERE id=? LIMIT 1",
                [param.id],
                function(err, result){
                    if(err) console.log(err);
                    else    console.log(result);
                    pool.release(conn);
                    cb(err, result);
                }
            );
        }   
    });
}

이런식으로 쓰시면 됩니다.

  • 2016년 10월 26일에 작성됨

  • 감사합니다. ㅠㅠ 실무 예제를 참고하고 싶었는데 많은 도움 되었습니다!    상남자   2016.10.26 20:33     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close