首页 > 解决方案 > 续集节点js中的options.pool.validate

问题描述

Postgres 序列名称 -post_seq

SELECT 查询以获取下一个序列 -select nextval(post_seq)

使用续集 v5.x

池配置 -

{
      max: 10,
      min: 1,
      acquire: 30000,
      idle: 10000,
      validate: async pgClient => {
        const result = await pgClient.query('SELECT pg_is_in_recovery()');
        const isReadOnly = result.rows[0].pg_is_in_recovery;
        console.log(isReadOnly, 'isReadOnly:src/utils/db.js')
        return !isReadOnly;
      }
    }

期待 -

options.pool.validate为应用程序中运行的所有查询(包括上述 SELECT 查询)调用以获取下一个序列 ID

发生了什么 -

options.pool.validate仅对非 SELECT 查询调用

我假设这是续集的默认行为。如果是这种情况,那么强制 SELECT 查询仅使用可写连接的另一种方法是什么?这种预期的原因是,在 AWS RDS 故障转移期间,读取器连接不能用于运行上述 SELECT 查询,因为nextval()它不仅仅是一个选择查询。如果有办法为此 SELECT 查询调用 options.pool.validate,sequelize 将在进行此nextval()查询之前丢弃该连接,因为使用了池配置。截至目前,我在服务器日志中收到的错误如下 -

SequelizeDatabaseError: cannot execute nextval() in a read-only transaction\n

其他几点需要注意 -

  1. 我正在连接到 nodejs 应用程序中的集群写入器端点
  2. 我正在使用'SELECT pg_is_in_recovery()'查询来检查正在使用的连接是否是只读的。如果它是只读的,则连接被 sequelize 丢弃。
  3. 我尝试useMaster:true在池配置中使用,但在故障转移场景中似乎没有帮助。可能,这主要用于复制而不是 DR 设置。

标签: node.jssequelize.jsfailover

解决方案


推荐阅读