반응형

Mysql Pool

이번에 사용 하는 클라우드 서버는 
Mysql 설정 파일을 바꿔도 윗단에서 커넥션을 빠르게 끊어버리는 바람에 문제가 되었습니다. 

맨 처음에는 setInterval와 end 함수의 콜백을 이용해 특정 시간이 될 때마다 
커넥션을 모두 끊고 다시 연결을 만들도록 했었는데요. 
그래도 어느 순간이 되면 커넥션 에러가 발생 했습니다. 

다음 시도는 Mysql-simple-pool모듈을 사용 하는 것이었습니다. 
저번에 Mysql-simple-pool에 관해 포스팅을 한 적이 있었죠. 
그런데 사용시 전에는 없었던 문제가 생겼습니다. 그것은 쿼리를 처음 할 땐 에러가 난다는 것이었죠. 
쿼리를 몇 번 하고 나서야 에러가 안나고 잘 처리 되었습니다. 

여러가지 해결 방법을 찾아보다가 Mysql모듈도 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
33
34
35
36
var mysql = require('mysql');
 
var mysqlConfig = {
  host:       "아이피",
  port:       "포트",
  user:       "아이디",
  password:   "암호",
  database:   "데이터베이스"
  };
 
var pool= mysql.createPool(mysqlConfig);
 
    pool.getConnection(function(err,connection){
        connection.query("쿼리",function(err,rows){
        //rows를 처리할 내용
        //release를 해주어 커넥션이 pool로 되돌아 갈 수 있도록 해줍니다.
        connection.release();
        //이제 이 커넥션은 pool로 돌아가 다른 주체가 사용 할 수 있도록 준비합니다.
        });
    });
 
//추가사항 : 이렇게 해줘도 끊기는 현상이 발생 할 때가 있었습니다.
//이건 최후의 방법인데 특정 시간마다 연결했다 끊는겁니다.
//저는 결국 이 방법으로 해결했습니다.
 
function keepAlive(){
   pool.getConnection(function(err, connection){
     if(err) { return; }
     connection.ping();
     connection.release();
   });
 
    //redis client를 사용중이라면, 아마 Redis연결도 빠르게 끊길겁니다.
    //client.ping();  // 라고 해주면 Redis연결도 유지합니다.
 }
 setInterval(keepAlive, 60*1000);



출처: http://blog.mygentle.com/2013/11/nodejs-mysql.html

반응형
,