【问题标题】:How to set query timeout in Sequelize?如何在 Sequelize 中设置查询超时?
【发布时间】:2019-11-28 22:15:51
【问题描述】:

我正在寻找如何在 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
  },
})

任何见解将不胜感激!

【问题讨论】:

标签: mysql node.js sequelize.js timeout


【解决方案1】:

添加dialectOptions

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

【讨论】:

  • 警告,该答案在 Sequelize v5 中不再有效,mysql2 不再采用该选项。超时必须在查询级别处理。如果您离开该选项,将显示如下警告消息Ignoring invalid configuration option passed to Connection: options. This is currently a warning, but in future versions of MySQL2, an error will be thrown if you pass an invalid configuration option to a Connection
【解决方案2】:

如果有人在这里偶然发现查询超时的 Postgres 特定配置(即node-postgres),它在 sequelize v5 中看起来像这样:

dialectOptions: {
  statement_timeout: 1000,
  idle_in_transaction_session_timeout: 5000
}

这会将 statement_timeout 设置为 1s,idle_in_transaction_session_timeout 设置为 5s。 参考。 https://github.com/sequelize/sequelize/blob/master/src/dialects/postgres/connection-manager.js

一些node-postgres (i.e. require('pg')) config options re: 超时包括:

  • statement_timeout?: number, // 查询语句超时前的毫秒数,默认不超时
  • query_timeout?: number, // 查询调用超时前的毫秒数,默认不超时
  • connectionTimeoutMillis?: number, // 等待连接的毫秒数,默认不超时
  • idle_in_transaction_session_timeout?: number // 终止任何带有打开的空闲事务的会话之前的毫秒数,默认为无超时

【讨论】:

【解决方案3】:

对于 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 }
    });
    

【讨论】:

    【解决方案4】:

    在我的例子中,它直接将 requestTimeout 字段添加到 dialectOptions 对象中:

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

    续集版本:^4.42.0

    【讨论】:

      【解决方案5】:

      我有同样的问题,但我使用我的 http://localhost:8888 作为我的端口,直到我将端口更改为我的 MySQL 端口 8889,除了最后一个数字外,它看起来一样,我没有支付太多注意查看差异,在使用 MAMP 时,您需要检查显示 MySQL 服务器端口和主机详细信息的网页。

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

        • 您永远不应更改node_modules,因为一旦重新安装它们或其他开发人员在您的项目上工作,您所做的任何更改都将丢失。并且 connectTimeout 与连接到数据库的时间有关,而不是请求所花费的时间
        猜你喜欢
        • 1970-01-01
        • 2022-09-23
        • 2011-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-29
        相关资源
        最近更新 更多