sitelink1 https://blog.naver.com/pass4u/220027954372 
sitelink2  
sitelink3  
extra_vars4  
extra_vars5  
extra_vars6  

단일 DB를 연결하는 Connection Pool이외에도 여러 개의 데이터 베이스를 연결하는 Conneciton Pool의 개념인 poolCluster를 제공한다. 

이 poolCluster는 동시에 여러 개의 ConnectionPool을 포함하는 일종의 집합이다. 여러 개의 mysql node를 묶어서 클러스터 구성을 할 수 있는 환경이 없어서, https://github.com/felixge/node-mysql 에 나와있는 예제를 인용하였다.

 

// create

var poolCluster = mysql.createPoolCluster();

 

poolCluster.add(config); // anonymous group

poolCluster.add('MASTER', {

    host : 'localhost',

    user : 'master',

    password : '1234',

    database : 'master_db',

    port : '3306'

});

poolCluster.add('SLAVE1'{

    host : 'localhost',

    user : 'slave1',

    password : '1234',

    database : 'slave1_db',

    port : '3306'

});

poolCluster.add('SLAVE2'{

    host : 'localhost',

    user : 'slave2',

    password : '1234',

    database : 'slave2_db',

    port : '3306'

});

 

// Target Group : ALL(anonymous, MASTER, SLAVE1-2), Selector : round-robin(default)

poolCluster.getConnection(function (err, connection) {});

 

// Target Group : MASTER, Selector : round-robin

poolCluster.getConnection('MASTER'function (err, connection) {});

 

// Target Group : SLAVE1-2, Selector : order

// If can't connect to SLAVE1, return SLAVE2. (remove SLAVE1 in the cluster)

poolCluster.on('remove'function (nodeId) {

  console.log('REMOVED NODE : ' + nodeId); // nodeId = SLAVE1

});

 

poolCluster.getConnection('SLAVE*''ORDER'function (err, connection) {});

 

// of namespace : of(pattern, selector)

poolCluster.of('*').getConnection(function (err, connection) {});

 

var pool = poolCluster.of('SLAVE*''RANDOM');

pool.getConnection(function (err, connection) {});

pool.getConnection(function (err, connection) {});

 

// destroy

poolCluster.end();

 

이 코드는 “master- 2개의 slave 복제 구조”로 되어 있는 mysql 에 각 DB에 3개의 connection pool을 연결하여 pool cluster로 묶은 예제이다. 

poolCluster에서 connection 을 가지고 오는 것은poolCluster.getConnection(“풀이름”) 을 사용하면 되는데, 위의 SLAVE*와 같이 ‘*’를 사용할 수 있다.  

이 경우에는 어떤 정책으로 Pool을 가지고 올지를 정해야 하는데, 3 가지 정책을 지원한다.

 

RR : Connection을 해당 이름의 풀들에서 번갈아 가면서 한번씩 리턴한다.

ORDER : Connection을 무조건 첫번째 풀에서부터 리턴하는데, 장애가 났을 경우에만 다음 풀의Connection을 순차적으로 리턴한다.

            이 경우에는 HA 구성등에 유리하게 사용할 수 있다.

RANDOM : 순서 없이 무작위로 아무 풀에서나 connection을 리턴한다.

 

이 외에도 살펴보면, Store Procedure 수행이나, Streaming, Pipe와 같은 기능들도 제공한다. 

그러나 아직까지 엔터프라이즈 자바에 비해서는 분산 트렌젝션 관리 능력이나 배치 처리등은 부족한 것이 사실이고, 오픈되어 있는 모듈도 아직 성숙도가 기존의 JDBC/MySQL 모듈에 비해서 높지 않다. 

예를 들어서, connection이 끊어지지 않게 주기적으로 Keep alive query를 보내는 기능등. 

일반적인 B2C 애플리케이션에서는 충분히 사용가능 하지만, 고가용을 요구하거나 데이타 분실이나 은행과 같은 높은 수준의 트렌젝션 보장이 필요한 곳에는 적절하지 않다. (물론 그런곳에는 mysql을 사용하지도 않겠지만)

 

 

 

좀 더 응용해 보자면

아래와 같이 PoolCluster 를 이용한 쿼리 함수를 export하여 모듈로 만들어 사용할 수 있다

 

var mysql = require('mysql');

var poolCluster = mysql.createPoolCluster();

// poolCluster 이용한 DB연결

 

poolCluster.add('MASTER', {

    host: 'localhost',

    user: 'root',

    password: '1234',

    database: 'test',

    port: '3306'

});

 

function executeQuery(sql, values, callback) {

    console.log("executeQuery sql : " + sql);

    console.log("executeQuery whereto : " + values);

    poolCluster.getConnection("MASTER", function (err, connection) {

        if (err) {

            console.log(JSON.stringify(err));

            connection.release();

            callback(err, null);

        } else {

            connection.query(sql, values, function (err, rows) {

                connection.release();

                if (!err) {

                    callback(null, {

                        rows: rows

                    });

                }

            });

        }

    });

}

 

function end() {

    poolCluster.end();

}

 

module.exports.executeQuery = executeQuery;

module.exports.end = end;

 
 
 

 

 

 

번호 제목 글쓴이 날짜 조회 수
56 Node.js로 ES6 코드 실행하기 (Babel) file 황제낙엽 2023.01.07 3
55 자바스크립트 CommonJS 모듈 내보내기/불러오기 (require) file 황제낙엽 2023.01.07 1
54 Node.js에서 ES 모듈(import/export) 사용하기 file 황제낙엽 2023.01.07 1
53 CommonJS 와 ES 의 Module 시스템 황제낙엽 2023.01.07 1
52 [session] 기본 - Express-session 기반 로그인 세션 관리 황제낙엽 2022.01.03 1
51 [session] 기본 - 2 file 황제낙엽 2022.01.03 0
50 [session] 기본 - 1 황제낙엽 2022.01.03 1
49 [T아카데미] Node.js 프로그램 기초부터 응용까지 강좌 모음 황제낙엽 2021.03.15 29
48 Node.js 에서 Bulk INSERT 를 하는 방법 (multi insert) 황제낙엽 2021.02.02 663
47 mysql, mysql2 모듈 버전 비교 황제낙엽 2021.01.31 269
46 [T아카데미/Node.js 프로그래밍] 프로그램 흐름 제어 (콜백지옥, Async, Promise) file 황제낙엽 2021.01.27 17
45 ORM 툴 Sequelize file 황제낙엽 2021.01.27 12
44 [connection과 pool-05] pool 생성이 너무 많은 경우의 database에서의 에러 - Too many connections file 황제낙엽 2021.01.27 50
43 [connection과 pool-04] connection pool 에서의 Transaction을 이용한 commit 과 rollback 황제낙엽 2021.01.27 64
42 [connection과 pool-03] mysql.createPool 과 connection.query 황제낙엽 2021.01.27 383
41 [connection과 pool-02] mysql.createPool 과 pool.query 황제낙엽 2021.01.27 23
40 [connection과 pool-01] mysql.createConnection 과 connection.query 황제낙엽 2021.01.27 39
39 [T아카데미/Node.js 프로그래밍/MySQL] createPool, getConnection 의 간단한 예제 (강의 예제) 황제낙엽 2021.01.27 49
» 여러 개의 데이터 베이스 연결을 동시에 관리하는 PoolCluster 황제낙엽 2021.01.16 2205
37 connetion pooling 과 connection leak 황제낙엽 2021.01.16 35