在 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 连接的主要内容,如果未能解决你的问题,请参考以下文章