2014-11-05 56 views
0

我想执行一个脚本来执行很多查询,我使用pg来管理连接。问题是当我的池已满时,我的程序停止并且未对未来的查询排队。我尝试将poolSize设置为0,但它也不起作用。管理从nodejs到postgres的许多连接pg

pg.defaults.poolSize = 100000000; 

var pgQuery = function(query) { 
    return new Promise(function(resolve, reject) { 
    pg.connect(conString, function(err, client) { // When the pool is full, pg doesn't connect to the DB 
     if(err) { 
     console.error('error fetching client from pool', err); 
     reject(err); 
     } 
     client.query(query, 
     function(err, res) { 
     if(err) { 
      console.error('error running query', err); 
      reject(err); 
     } 
     resolve(res); 
     }); 
    }); 
    }); 
}; 

有什么建议吗?

回答

2

我发现我的问题,我没有将客户端释放回池中。为此,我必须在执行完查询后调用done()回调函数。

var pgQuery = function(query) { 
    var attempt = 0; 
    return new Promise(function(resolve, reject) { 


    // I added the done callback in parameter. 
    pg.connect(conString, function(err, client, done) { 
     if(err) { 
     console.error('error fetching client from pool', err); 
     attempt++; 
     if (attempt < 11) { 
      pgQuery(query); 
     } else { 
      reject(err); 
     } 
     } 
     client.query(query, 
     function(err, res) { 


     //call `done()` to release the client back to the pool 
     done(); 
     if(err) { 
      console.error('error running query', err); 
      reject(err); 
     } 
     resolve(res); 
     }); 
    }); 
    }); 
}; 

另外我的请求是cpu密集型,需要很长时间才能执行。因为我的请求被称为两次,我与此解决了这个问题

// Without this line the http request is triggered twice 
req.connection.setTimeout(15*60*1000)