node.js - 续集节点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
其他几点需要注意 -
- 我正在连接到 nodejs 应用程序中的集群写入器端点
- 我正在使用
'SELECT pg_is_in_recovery()'
查询来检查正在使用的连接是否是只读的。如果它是只读的,则连接被 sequelize 丢弃。 - 我尝试
useMaster:true
在池配置中使用,但在故障转移场景中似乎没有帮助。可能,这主要用于复制而不是 DR 设置。
解决方案
推荐阅读
- c# - Automapper 将 id 列表映射到多对多场景中的对象
- python - 在 Django 上保存自定义模型管理员时出错
- django - Django2.1-错误-一切正常,但它开始给出 {% ur 'name' %}l 错误
- google-cloud-dataflow - Google Dataflow - 如果写入本地服务器,如何在 java 中指定 TextIO?
- python - 无法在 Git 中推送一些 refs
- mysql - 根据其他表中的条件计算列
- arrays - 如何在redux reducer中更新二维数组中的值?
- python - 我的代码一直说 AttributeError: 'str' object has no attribute 'formart'
- python - 一些模块以前可以在python中导入,但现在只能在ipython2中导入
- javascript - 拒绝执行脚本 runtime.js,因为 MIME 类型不可执行