2016-06-08 41 views
0

我正在使用pg節點模塊來連接數據庫。我一直在爲每個DML操作創建多個連接。當連續查詢執行發生時 我收到警告消息爲「(節點)警告:可能發生EventEmitter內存泄漏,添加了11個錯誤偵聽器,使用emitter.setMaxListeners()來增加限制。給定PG默認poolSize爲5(節點)警告:可能檢測到EventEmitter內存泄漏。添加了11個錯誤偵聽器。使用emitter.setMaxListeners()來增加限制

var pg = require('pg') 
pg.defaults.poolSize = 5; 
var dbHelper = { 
initializeConnection: function (callback) { 
    pg.connect(conString, function (err, client, done) { 
     if (err) { 
      done(client); 
      return callback(err, null); 
     } 
     callback(null, client, done); 
    }); 

    pg.on('error', function (err) { 
    }); 
    pg.end(); 
}, 
    query: function (pgQuery, args, callback, options) { 
    this.initializeConnection(function (err, client, done) { 
      client.query(pgQuery, args, function (err, response) { 
      done(); 
      return callback(err, response); 
     }); 
    }); 
}, 
}; 

module.exports = dbHelper; 

樣本查詢

dbHelper.query("SELECT name,age,address FROM EMPLOYEE WHERE id=$1", [1001], function (err, response) { 
     callback(err, response); 
    }); 

如何防止事件發射器的內存韭菜。

回答

0

的原因是你沒有正確地釋放連接:

pg.connect(conString, function (err, client, done) { 
     if (err) { 
      done(client); 
      return callback(err, null); 
     } 
     callback(null, client, done); 
    }); 

這應該是:

pg.connect(conString, function (err, client, done) { 
    if (err) { 
     callback(err, null); 
    } else { 
     callback(null, client); 
     done(); 
    } 
}); 

即打電話done()時沒有錯誤。

如果你想完全避免這種錯誤 - 檢查出pg-promise;)

相關問題