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

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

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

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

제가 생각하기로는,

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

정도가 떠오릅니다.

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

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

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 20:33

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.