当前位置: 首页 > 面试题库 >

重现MySQL错误:服务器关闭了连接(node.js)

师承弼
2023-03-14
问题内容

我试图重现我在EC2上的node.js应用中看到的MySQL错误,其中包含节点mysql库:

连接丢失:服务器关闭了连接。

我无法在本地重现该错误-通过我的代码可以很好地处理数据库-
它仅每隔几秒钟重新检查一次,并在重新启动后重新连接到db。在EC2上,它发生在太平洋时间凌晨4点左右,但是数据库仍然正常运行。

我想

  1. 用我的本地mysql重现崩溃
  2. 在我的mysql帮助器模块中添加我需要的任何逻辑

这是我的node.js应用程序中的错误:

2012-10-22T08:45:40.518Z-错误:uncaughtException date = Mon Oct 22 2012
08:45:40 GMT + 0000(UTC),pid = 14184,uid = 0,gid = 0,cwd = / home / ec2
-user / my-app,execPath = / usr / bin / nodejs,版本= v0.6.18,argv = [/ usr /
local / bin / node,/ home / ec2-user / my-app / app.js,- -my-app],rss =
15310848,heapTotal = 6311392,heapUsed = 5123292,loadavg =
[0.0029296875、0.0146484375、0.04541015625],正常运行时间= 3238343.511107486,trace =
[列= 13,文件= / home / ec2-user / my- app / node_modules / mysql / lib /
protocol / Protocol.js,function = Protocol.end,line = 63,method = end,native
= false,column = 10,file = stream.js,function = Socket.onend,line =
80,method = onend,native = false,column = 20,file = events.js,function =
Socket.emit,line = 88,method = emit,native = false,column = 51,file =
net.js,function = TCP.onread,行= 388,方法= onread,本机= false,堆栈=
[错误:连接丢失:服务器关闭了连接。
在Socket.onend(stream.js:80:10)的Protocol.end(/home/ec2-user/my-
app/node_modules/mysql/lib/protocol/Protocol.js:63:13)处。在TCP.onread(net.js:388:51)发出(events.js:88:20)]

这是我的代码(mysql帮助程序模块):

module.exports = function (conf,logger) {
  var mysql = require('mysql');

  var connectionState = false;
  var connection = mysql.createConnection({
    host: conf.db.hostname,
    user: conf.db.user,
    password: conf.db.pass,
    database: conf.db.schema,
    insecureAuth: true
  });

  function attemptConnection(connection) {
    if(!connectionState){
      connection = mysql.createConnection(connection.config);
      connection.connect(function (err) {
        // connected! (unless `err` is set)
        if (err) {
          logger.error('mysql db unable to connect: ' + err);
          connectionState = false;
        } else {
          logger.info('mysql connect!');
          connectionState = true;
        }
      });
      connection.on('close', function (err) {
        logger.error('mysqldb conn close');
        connectionState = false;
      });
      connection.on('error', function (err) {
        logger.error('mysqldb error: ' + err);
        connectionState = false;

        /*
        if (!err.fatal) {
          return;
        }
        if (err.code !== 'PROTOCOL_CONNECTION_LOST') {
          throw err;
        }
        */
      });
    }
  }
  attemptConnection(connection);

  var dbConnChecker = setInterval(function(){
    if(!connectionState){
      logger.info('not connected, attempting reconnect');
      attemptConnection(connection);
    }
  }, conf.db.checkInterval);

  return connection;
};

问题答案:

这是我最终使用的,效果很好。偶尔连接丢失/重新启动,恢复得很好。我有一个database.js文件,它建立连接并定期检查它们。

提出要求:

var conn = require('./database');
var sql = 'SELECT foo FROM bar;';
conn.query(sql, [userId, plugId], function (err, rows) {
   // logic
}

这是我的databbase.js

var mysql = require('mysql');
var Common = require('./common');
var conf = Common.conf;
var logger = Common.logger;

var connectionState = false;
var connection = mysql.createConnection({
  host: conf.db.hostname,
  user: conf.db.user,
  password: conf.db.pass,
  database: conf.db.schema,
  insecureAuth: true
});
connection.on('close', function (err) {
  logger.error('mysqldb conn close');
  connectionState = false;
});
connection.on('error', function (err) {
  logger.error('mysqldb error: ' + err);
  connectionState = false;
});

function attemptConnection(connection) {
  if(!connectionState){
    connection = mysql.createConnection(connection.config);
    connection.connect(function (err) {
      // connected! (unless `err` is set)
      if (err) {
        logger.error('mysql db unable to connect: ' + err);
        connectionState = false;
      } else {
        logger.info('mysql connect!');

        connectionState = true;
      }
    });
    connection.on('close', function (err) {
      logger.error('mysqldb conn close');
      connectionState = false;
    });
    connection.on('error', function (err) {
      logger.error('mysqldb error: ' + err);

      if (!err.fatal) {
        //throw err;
      }
      if (err.code !== 'PROTOCOL_CONNECTION_LOST') {
        //throw err;
      } else {
        connectionState = false;
      }

    });
  }
}
attemptConnection(connection);

var dbConnChecker = setInterval(function(){
  if(!connectionState){
    logger.info('not connected, attempting reconnect');
    attemptConnection(connection);
  }
}, conf.db.checkInterval);

// Mysql query wrapper. Gives us timeout and db conn refreshal! 
var queryTimeout = conf.db.queryTimeout;
var query = function(sql,params,callback){
  if(connectionState) {
    // 1. Set timeout
    var timedOut = false;
    var timeout = setTimeout(function () {
      timedOut = true;
      callback('MySQL timeout', null);
    }, queryTimeout);

    // 2. Make query
    connection.query(sql, params, function (err, rows) {
      clearTimeout(timeout);
      if(!timedOut) callback(err,rows);
    });
  } else {
    // 3. Fail if no mysql conn (obviously)
    callback('MySQL not connected', null);
  }
}

// And we present the same interface as the node-mysql library!
// NOTE: The escape may be a trickier for other libraries to emulate because it looks synchronous
exports.query = query;
exports.escape = connection.escape;


 类似资料:
  • 问题内容: 当我使用节点mysql时,在12:00到2:00之间出现错误,表明服务器已关闭TCP连接。这是完整的消息: 有解决办法。但是,以这种方式尝试后,问题也会出现。现在我不知道该怎么办。有人遇到这个问题吗? 这是我按照解决方案编写的方式: 问题答案: 尝试使用以下代码来处理服务器断开连接: 在您的代码中,我错过了之后的部分

  • 我是Ruby on Rails的新手。我通过教程创建了两个基本的演示应用程序 PG::错误 服务器意外关闭了连接这可能意味着服务器在处理请求之前或处理请求时异常终止。 而且有时(通常是在我重新启动postgresql时), PG::错误 服务器意外关闭了连接这可能意味着服务器在处理请求之前或处理请求时异常终止。无法发送启动数据包:管道中断 这是我的堆栈跟踪 我在Ubuntu12.04(因为goog

  • 我一直试图通过Postgre DB Server运行这个批处理文件,并运行两个不同的sql文件,如下所示: 但是问题来了,有时我会得到下面的命令query1或query2的错误: 这种情况只是偶尔发生,所以我不完全确定为什么会发生。有人能解释为什么会这样,以及这个问题是否有解决办法吗?谢谢! 更新:在实际的Postgre应用程序中尝试打开远程服务器时,我有时也会遇到相同的错误:“出现错误:”服务器

  • Express 错误:连接丢失:服务器关闭了连接。 大佬们如何解决 var express = require('express'); var app = express(); const cors = require('cors'); app.use(cors()); app.use(express.static('./public')) const bodyParser = require('

  • 我进入了一个客户机和服务器进行通信、相互发送消息的阶段。 我遇到的问题是如何关闭连接而不会导致错误? 如果我终止其中一个导致连接丢失的应用程序(服务器或客户端),然后导致等待输入的循环无限期地循环,并显示null。 我试图关闭插座,缓冲区,甚至线程,都不工作。 这是客户端 这是服务器端 两者都使用这些类: 唯一的区别是服务器在上面所说的位置有这个位, 所以基本上,客户端连接,服务器接受,然后客户端

  • 更新:以下错误消息来自。 错误:服务器访问错误:连接重置URL=https://repo1.Maven.org/maven2/org/fusesource/jansi/jansi/1.11/jansi-1.11.pom Maven central:org/fusesource/jansi#jansi;1.11:res=https://repo1.Maven.org/maven2/org/fuses