在 sequelize 中检查 mysql 连接

Posted

技术标签:

【中文标题】在 sequelize 中检查 mysql 连接【英文标题】:Check mysql connection in sequelize 【发布时间】:2013-10-26 02:04:43 【问题描述】:

我有一个非常简单的程序,我在其中创建了一个 Sequelize 实例,然后对 mysql 数据库执行原始查询。 案例是当MySql启动并运行没有问题时,我可以毫无问题地执行查询。 但是当 MySql 没有运行时,查询不会发出任何错误,直到达到查询超时,然后它会发出 ETIMEOUT 错误。但事实并非如此。如果 mysql 未运行,我希望查询会发出 ENOTFOUND 错误或类似的错误,因此如果 Mysql 已关闭或 Mysql 非常忙并且响应时间非常长,我可以管理错误并执行不同的操作。 我应该怎么做才能检查 Mysql 是否已启动并运行而无需等待超时异常。

sequelize = new Sequelize(db_name, db_user, db_pass, opts);

sequelize.query('SELECT * FROM some_table').success(function(result) 
  console.log(result);
).error(function(err) 
  console.log(err);
);

【问题讨论】:

您应该监控您的 MySQL 服务器,使其始终处于运行状态,而不是编写不必要的偏执的应用程序代码。超时是服务器关闭和连接失败的正确行为。如果太慢,您可以收紧超时值。 在偏执的情况下,即使 MySQL 服务器启动并且查询确实发出错误,由于过载,不用说需要更好的数据库基础架构,您可以使用缓存服务器,例如作为 Redis,为了更快的响应,但是如果您的所有查询都像您的示例中的查询一样,那么它并没有考虑到性能,我的意思是,对于 10.000 行它可能没问题,但是对于每 5 秒或 10 秒查询一百万行那么它就不行了..恕我直言,您应该重新设计和研究更好的方法,我敢打赌有更好的方法。 【参考方案1】:

截至Sequelize(即3.3.2)的最新版本,authenticate可用于检查连接:

var sequelize = new Sequelize("db", "user", "pass");

sequelize.authenticate().then(function(errors)  console.log(errors) );

authenticate 只需运行SELECT 1+1 AS result 查询来检查数据库连接。

更新

newest API 的错误需要在catch 中处理:

sequelize
  .authenticate()
  .then(() => 
    console.log('Connection has been established successfully.');
  )
  .catch(err => 
    console.error('Unable to connect to the database:', err);
  );

更新 2

我还没有对此进行测试,但使用async/await 可以达到相同的效果是唯一合乎逻辑的:

try 
  await sequelize.authenticate()
 catch (err) 
  console.error('Unable to connect to the database:', err)

【讨论】:

@TiagoGouvêa 旧 API 在then 中返回错误。较新的使用正确的承诺!【参考方案2】:

您不会在.then 中看到错误,例如密码验证错误。

来自续集文档here:

您可以像这样使用 .authenticate() 函数来测试 连接。

sequelize
  .authenticate()
  .then(function(err) 
    console.log('Connection has been established successfully.');
  )
  .catch(function (err) 
    console.log('Unable to connect to the database:', err);
  );

【讨论】:

【参考方案3】:

请检查“wait_timeout”系统变量是否被重置为一些微不足道的值

【讨论】:

【参考方案4】:

我使用以下代码等待db引擎启动:

function sleep(ms) 

    return new Promise(function(resolve) 

        setTimeout(resolve, ms);
    );


for (;;) 

    try 

        await db.authenticate();
        break;
     catch(ex) 

        await sleep(1000);
    

【讨论】:

理想情况下,这类循环会有最大尝试次数限制:)

以上是关于在 sequelize 中检查 mysql 连接的主要内容,如果未能解决你的问题,请参考以下文章

使用egg.js和egg-sequelize连接mysql

在macOS上用xampp mysql连接sequelize

Sequel Pro 和 MySQL 连接失败

MariaDB 与 Sequelize 的连接

sequel pro无法连接mysql服务器

全栈项目|小书架|服务器开发-NodeJS 中使用 Sequelize 操作 MySQL数据库