如何在Sequelize中设置查询超时时间?

17

我想了解如何在Sequelize中设置查询超时时间。

我查看了Sequelize文档,但没有找到我需要的信息。 最接近的是"pools.acquire"选项,但我不是要设置传入连接的超时时间,而是查询正在运行时的超时时间,这样我就可以快速地终止死锁。

http://docs.sequelizejs.com/class/lib/sequelize.js~Sequelize.html

这是我的示例代码:

const db = new Sequelize( database, username, password, {
  host   : hostname,
  dialect: "mysql",
  define : {},
  pool: {
    max : 10,
    min : 0,
    idle: 10000
  },
})

任何见解都将不胜感激!


2
显然目前还不支持:https://github.com/sequelize/sequelize/issues/2072最好的做法是为MySQL的'dialectOptions'指定“connectTimeout”。 - Bbbbob
6个回答

14

添加dialectOptions

  const db2 = new Sequelize(database, username, password, {
    host: hostname,
    dialect: "mysql",
    define: {},
    dialectOptions: {
      options: {
        requestTimeout: 3000
      }
    },
    pool: {
      max: 10,
      min: 0,
      idle: 10000
    },
  });

3
警告:在Sequelize v5中,该回答已不再有效,mysql2不再接受那个选项。超时必须在查询级别上处理。如果您保留该选项,将显示以下警告消息:“忽略传递给Connection的无效配置选项:options。目前这是一个警告,但在MySQL2的未来版本中,如果您向Connection传递无效的配置选项,则会抛出错误”。 - nicolasrigaudiere
dialectOptions中的关键字options是错误的 - 至少在2023年是这样。它必须是dialectOptions: { connectTimeout: 3000 } } - René Pöpperl

13
如果有人在这里寻找与Postgres相关的配置(即node-postgres)以进行查询超时,那么在sequelize v5中,它看起来像这样:
dialectOptions: {
  statement_timeout: 1000,
  idle_in_transaction_session_timeout: 5000
}

这将把statement_timeout设置为1秒,将idle_in_transaction_session_timeout设置为5秒。 参考https://github.com/sequelize/sequelize/blob/master/src/dialects/postgres/connection-manager.js 关于超时的一些node-postgres (即require('pg'))配置选项包括:
  • statement_timeout:数字,查询中语句超时前的毫秒数,默认为无超时
  • query_timeout:数字,查询调用超时前的毫秒数,默认为无超时
  • connectionTimeoutMillis:数字,等待连接的毫秒数,默认为无超时
  • idle_in_transaction_session_timeout:数字,空闲事务打开的会话终止前的毫秒数,默认为无超时

1
如果您的 pg 包版本过旧,可能不支持这些设置。目前 pg-native 完全不支持它们 - sezanzeb
我认为我需要使用 query_timeout 选项,statement_timeout 选项对我没有造成任何超时。 - Nate Anderson
或者考虑使用 connectionTimeoutMillis 选项,事实上当我升级到 Node 14 时,我的 node-postgres 无法连接,很可能是因为这个原因 - Nate Anderson

5

对于 Sequelize v6 和使用 mysql2 驱动程序,以下代码是有效的:

export const database = new Sequelize(
    Config.get('DB.NAME'),
    Config.get('DB.USER'),
    Config.get('DB.PASS'),
    {
        host: Config.get('DB.HOST'),
        port: 3306,
        dialect: 'mysql',
        dialectOptions: { connectTimeout: isDevEnv ? 15000 : 5000 }
    });
    

2
在我的情况下,将requestTimeout字段直接添加到dialectOptions对象中即可:
const db2 = new Sequelize(database, username, password, {
  host: hostname,
  dialect: "mysql",
  define: {},
  dialectOptions: {
    requestTimeout: 3000
  },
  pool: {
    max: 10,
    min: 0,
    idle: 10000
  }
});

Sequelize版本:^4.42.0


0

我曾经遇到过同样的问题,但是我使用的是我的http://localhost:8888作为端口,直到我将端口更改为我的MySQL端口8889,它看起来几乎一样,除了最后一个数字,我没有注意到这个区别,当使用MAMP时,您需要检查显示MySQL服务器详细信息的Web页面以获取端口和主机。


-4

打开本地文件 node_modules/_mysql@2.17.1@mysql/lib/ConnectionConfig.js

this.connectTimeout 的默认值更改如下:

  this.connectTimeout     = (options.connectTimeout === undefined)
    ? (10 * 10000)
    : options.connectTimeout;

1
你不应该更改 node_modules,因为一旦它们被重新安装或其他开发人员在你的项目上工作,你所做的任何更改都将丢失。而且 connectTimeout 关系到连接到数据库的时间,而不是请求所需的时间。 - nicolasrigaudiere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接