mysql2 nodejs池连接的ECONNRESET / ETIMEDOUT错误

时间:2019-07-07 03:28:05

标签: mysql node.js

我有一个node / express / mysql2 Web应用程序,该应用程序通过连接池对象访问mySql DB,并且经常遇到以下问题:我将代码保留一段时间,然后返回并访问运行查询的页面我会得到

  

foo中的错误:错误:连接ETIMEDOUT

     

栏中的错误:错误:读取ECONNRESET

我猜想在另一边,mysql会看到空闲连接并关闭它们,客户端应用程序不知道这些,从池中获取那些连接,然后遇到那些问题,很好。但是我的印象是,这是由mysql2自动处理的?

这大致就是我组织数据库代码的方式

sqlConnectionPool.js

const dbParam = require('./dbParam.js');
const sqlPool = require('mysql2/promise').createPool(dbParam.connection.prod);

module.exports = sqlPool;

dummyQuery.js

const sqlPool = require('./sqlConnectionPool.js');
module.exports.updatefoo = async (ID, sqlConnection = undefined) => {
  let connection;
  try {
    connection = sqlConnection === undefined ? await sqlPool.getConnection() : await sqlConnection;
    const [updateResult] = await connection.query('update foo set barID=?', [ID]);
    if (updateResult.affectedRows !== 1) {
      throw (new Error(`error on ID ${ID}`));
    }
    return undefined;
  } catch (err) {
    console.error(`Error in updatefoo: ${err}`);
    return err;
  } finally {
    if (sqlConnection === undefined) {
      connection.release();
    }
  }
};

我是否缺少某些东西来自动处理这些错误,或者根本就不会遇到这些错误?我猜mysql2库在遇到connreset或conntimeout错误时需要关闭连接,并将它们返回到池中。

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为您应该使用setTimeout()之类的东西来刺破数据库。