2013-12-23 28 views
0

起初我認爲它與垃圾收集有關,但是進一步調查問題,似乎mysql不再響應我的任何查詢。node.js mysql-simple-pool在12小時之後停止響應

我的每個模型都有一個require('./db.js');在他們的文件的頂部,它看起來像:

var Pool = require('mysql-simple-pool'); 

var mysql_pool = new Pool(50, { 
    host: process.env.IP || '127.0.0.1', //currently the db is on the server 
    user: 'USERNAME', 
    password: 'PASSWORD', 
    database: 'DATABASE' 
}); 

module.exports = mysql_pool; 

偉大的作品,我可以做這樣的事情:

db.query('select * from user where username = ? and password = ?', [username, hashed_password], function(err, rows) { 
    if (err) { 
     console.log("error in loginUser", err); 
     return callback(err, null); 
    } else { 
     if (rows[0]) { 
      var user = new User(rows[0]); 
      return callback(err, user); 
     } else { 
      return callback(err, null); 
     } 
    } 
}); 

除每12個小時左右就停止接聽。當人們嘗試登錄時,它只是坐在那裏,我最終得到超時錯誤。

如果用戶已經登錄,那麼來自內存的所有內容都很棒,但是我查詢數據庫的部分從未做出響應。

更新: 我在代碼中發現了一點點,我只是想着想這應該是什麼。

connection.on('error', function(err) { 
    // Check if the connection has been lost. 
    if (err.fatal && err.code !== 'PROTOCOL_CONNECTION_LOST') { 
     // Decrement the current number of _connections. 
     pool._currentNumberOfConnections--; 
    } 
}); 

由於某種原因,當協議連接丟失時它沒有做任何事情。我想知道是否有一種方法可以在連接丟失或重建時重新建立連接?我假設問題在於連接打嗝,並且由於我正在使用游泳池,所以他們基本都會迷路或卡住,而他們只是坐在那裏。

+0

爲什麼不分享所有的模塊之間的連接?你認爲你正在完成你所有的連接是否可行? –

+0

不知道我得到了你所問的,這確實在我所有的模塊之間共享同一個池,因爲它將相同的變量導出到所有模塊。 – silkcom

+0

mysql-simple-pool不活動且缺少測試。我認爲你可以對它進行壓力測試或切換到其他模塊。 – damphat

回答

0

切離的mysql-簡單池

db.php中現在看起來像:

var easy_mysql = require('easy-mysql'); 

var options = { 
    host: process.env.IP || '127.0.0.1', 
    user: 'USERNAME', 
    password: 'PASSWORD', 
    database: 'DATABASE', 
    pool_size: 50 
}; 

var pool = easy_mysql.connect_with_easy_pool(options); 

//this is here so it fills in the place of mysql-simple-pool while i port stuff over 
module.exports.query = function(sql, params, callback) { 
    if ("function" == typeof params) { 
     callback = params; 
     params = []; 
    } 
    pool.get_all(sql, params, callback); 
}; 

module.exports.get_all = pool.get_all; //these are here so i can slowly port stuff over 
module.exports.get_one = pool.get_one; 
module.exports.execute = pool.execute;