2016-05-23 38 views
1

我正在使用节点JS,我试图连接到一个MySQL数据库。它由于超时而保持断开连接,所以我写了一个函数来重新连接,如果它超时。虽然我需要它是一个连续的连接,否则我的代码中的引用将无法工作。这里是我的相关代码:节点JS mysql数据库断开连接

var mysql = require('mysql'); 
var connection = mysql.createConnection({ 
    host  : '.........', // MySQL Host 
    user  : '.........', // MySQL User 
    password : '.........', // MySQL Password 
    database : '.........' // MySQL Databse 
}); 

// MYSQL INFO 

//connection.connect(); 

function replaceClientOnDisconnect(connection) { 
    connection.on("error", function (err) { 
    if (!err.fatal) { 
     console.log('Databse Error, error not fatal'); 
     return; 
    } 

    if (err.code !== "PROTOCOL_CONNECTION_LOST") { 
     throw err; 
     console.log('PROTOCOL_CONNECTION_LOST Error: Reconnecting to database...'); 
    } 

    setTimeout(function() { 
     connection.destroy(); 
     connection = mysql.createConnection(connection.config); 
     replaceClientOnDisconnect(connection); 
     connection.connect(function (error) { 
      if (error) { 
      process.exit(1); 
      } else { 
       console.log('Reconnected to database!'); 
      } 
    }, 1000); // 1 sec 
    }); 
    }); 
} 

// And run this on every connection as soon as it is created. 
replaceClientOnDisconnect(connection); 

回答

0

您可以使用样本

var dbConfig = { 
     host: '----', 
     user: '----', 
     password: '----', 
     database: '----', 
     port: ---- 
    }; 

var connection; 
function handleDisconnect() { 
    connection = mysql.createConnection(dbConfig); // Recreate the connection, since the old one cannot be reused. 
    connection.connect(function onConnect(err) { // The server is either down 
     if (err) {         // or restarting (takes a while sometimes). 
      console.log('error when connecting to db:', err); 
      setTimeout(handleDisconnect, 10000); // We introduce a delay before attempting to reconnect, 
     }           // to avoid a hot loop, and to allow our node script to 
    });            // process asynchronous requests in the meantime. 
                // If you're also serving http, display a 503 error. 
    connection.on('error', function onError(err) { 
     console.log('db error', err); 
     if (err.code == 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually 
      handleDisconnect();       // lost due to either server restart, or a 
     } else {          // connnection idle timeout (the wait_timeout 
      throw err;         // server variable configures this) 
     } 
    }); 
} 
handleDisconnect();