2015년 1월 11일 일요일

[node mysql] node-mysql -> connection pool

  • connection은 연결 때 마다 connection을 새로 만들고 사용하면 연결을 끊는다. 1회성의 성격을 가진다는 뜻이다. 때문에 연결시마다 connection을 새로 생성하는데에 있어 낭비되는 자원이 생긴다.
  • pool은 connection들을 미리 만들어서 관리를 해주기 때문에 이러한 문제를 해결할 수 있다. 
  • connection pooling 기법은 미리 설정해 놓은 크기의 connection들을 준비하여 요청을 받으면 자원을 빌려주고 돌려받는다. pool은 그 connection의 연결을 끊지 않고 요청을 다시 기다리기 시작한다.
    • 즉 connection들을 관리하며 재사용을 한다.
  • 정해진 pool의 크기내의 연결은 원활한 연결을 지원하며, 넘어서는 연결 요청이 들어오면 이후의 요청들은 connection자원들이 생길때까지 대기를 한다.
    • pool이 아닌 보통의 connection에서는 많은 크기의 요청도 다 받아들이지만 느려지는 등의 부하를 준다.


 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
var mysql = require('mysql');
var pool  = mysql.createPool({
  connectionLimit : 10,
  host     : 'localhost',
  user     : 'root',
  password : '1234',
  database : 'node'
});

pool.on('connection', function (connection) {
  console.log('SET SESSION auto_increment_increment=1')
});

pool.on('enqueue', function () {
  console.log('Waiting for available connection slot');
});

for(var i = 1;i<=15;i++){
 console.log(i);
 var pool_con =
  pool.getConnection(function(err, connection) {
    // Use the connection
    connection.query( 'SELECT 1+1 AS solution', function(err, rows) {
      // And done with the connection.
      connection.release();

      // Don't use the connection here, it has been returned to the pool.
    });
  });
}


  • pooling의 예제 입니다. 
  • 3번 Line에서 connectionLimit는 pool의 크기입니다.
  • 10번라인은 pool내의 connection의 자원이 생길때 이벤트처리입니다.
  • 14번라인은 pool의 크기를 넘어서는 요청을 받아 대기열에 들어갈경우 발생하는 이벤트 처리입니다.



 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
32
0
1
2
3
4
5
6
7
8
9
10
Waiting for available connection slot
11
Waiting for available connection slot
12
Waiting for available connection slot
13
Waiting for available connection slot
14
Waiting for available connection slot
15
Waiting for available connection slot
SET SESSION auto_increment_increment=1
SET SESSION auto_increment_increment=1
SET SESSION auto_increment_increment=1
SET SESSION auto_increment_increment=1
SET SESSION auto_increment_increment=1
SET SESSION auto_increment_increment=1
SET SESSION auto_increment_increment=1
SET SESSION auto_increment_increment=1
SET SESSION auto_increment_increment=1
SET SESSION auto_increment_increment=1

  • 이 나옴을 볼수 있습니다.
  • pool의 크기가 10개인 만큼 10개까지는 처리가 잘되다가 이후부터는 enqueue이벤트가 발생, 즉 대기열에 들어감을 알수 있습니다.
  • 이후 release가 발생된다면 자원이 생겨 다음 요청을 처리하고 다시 다음 요청은 대기열에 들어가는 것이 계속 반복됩니다.
  • 이후 모든 요청이 처리되면 잉여 connection들이 생기면서 connection이벤트가 발생합니다. 모든 처리가 다 되는 시점에는 pool의 크기인 10번이 발생합니다.

댓글 없음:

댓글 쓰기