Node.js sequelize节点js中的options.pool.validate
Postgres序列名称-Node.js sequelize节点js中的options.pool.validate,node.js,sequelize.js,failover,Node.js,Sequelize.js,Failover,Postgres序列名称-post_seq 选择查询以获取下一个序列-选择nextval(post\u seq) 使用sequelize v5.x 池配置- { max: 10, min: 1, acquire: 30000, idle: 10000, validate: async pgClient => { const result = await pgClient.query('SELECT pg_is_in
post_seq
选择查询以获取下一个序列-选择nextval(post\u seq)
使用sequelize 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;
}
}
期望值-
对应用程序中运行的所有查询(包括上面的SELECT查询)调用options.pool.validate
,以获取下一个序列id
发生了什么事-
仅对非SELECT查询调用options.pool.validate
我假设这是sequelize的默认行为。如果是这样的话,还有什么方法可以强制SELECT查询只使用可写连接?这种预期的原因是,在AWS RDS故障切换期间,读卡器连接不能用于运行上述选择查询,因为nextval()
不仅仅是一个选择查询。如果有方法为此选择查询调用options.pool.validate,sequelize将在执行此nextval()
查询之前放弃该连接,因为使用了池配置。到目前为止,我在服务器日志中得到的错误如下-
SequelizeDatabaseError: cannot execute nextval() in a read-only transaction\n
还有几点需要注意:
“SELECT pg_is_in_recovery()”
查询来检查所使用的连接是否为只读连接。如果它是只读的,则sequelize将放弃该连接useMaster:true
,但在故障切换场景中似乎没有帮助。这可能主要在复制而不是灾难恢复设置的情况下有用