在NodeJS中通过Sequelize查询MariaDB时禁用缓存的方法
解决Sequelize查询MariaDB时无法获取实时数据的问题
方法一:在Sequelize findAll中添加SQL_NO_CACHE
你可以通过attributes选项,用Sequelize.literal在SELECT语句中插入SQL_NO_CACHE,强制跳过MariaDB的查询缓存:
isUserExists: async function (inUser, inChat, inLevel) { const iskunde = await kunden.findAll({ attributes: [Sequelize.literal('SQL_NO_CACHE *')], where: { kunde: inUser, chat: inChat, level: inLevel, created_at: { [Op.gte]: Sequelize.literal("DATE_SUB(NOW(), INTERVAL 15 MINUTE)"), }, }, raw: true, }); return Array.isArray(iskunde) && iskunde.length > 0; },
这段代码会生成带SQL_NO_CACHE的查询语句,确保每次都从数据库读取最新数据,而非使用缓存结果。
方法二:使用原始SQL查询
如果觉得ORM方式不够直接,也可以用Sequelize的原始查询方法,直接写出包含SQL_NO_CACHE的SQL语句:
isUserExists: async function (inUser, inChat, inLevel) { const [rows] = await sequelize.query( `SELECT SQL_NO_CACHE * FROM kunden WHERE kunde = ? AND chat = ? AND level = ? AND created_at >= DATE_SUB(NOW(), INTERVAL 15 MINUTE)`, { replacements: [inUser, inChat, inLevel], type: sequelize.QueryTypes.SELECT, raw: true } ); return Array.isArray(rows) && rows.length > 0; },
注意替换代码中的sequelize为你实际的Sequelize实例对象。
额外排查点
如果添加SQL_NO_CACHE后问题仍存在,需要考虑其他可能性:
- MariaDB版本问题:MariaDB 10.1.7开始废弃查询缓存,10.5版本后彻底移除。若你的数据库是新版本,缓存问题大概率不是查询缓存导致的。
- 事务隔离级别:检查插入操作是否在未提交的事务中,或者查询使用了
REPEATABLE READ默认隔离级别,导致无法读取未提交的新数据。可以尝试将查询的隔离级别改为READ COMMITTED:const iskunde = await kunden.findAll({ // 其他选项... transaction: await sequelize.transaction({ isolationLevel: Transaction.ISOLATION_LEVELS.READ_COMMITTED }) }); - Sequelize连接池:如果连接池中的连接持有旧的事务状态,也可能导致无法读取新数据,可以尝试在查询时强制使用新连接,或者调整连接池配置。
内容的提问来源于stack exchange,提问作者IFThenElse
相关产品推荐
相关产品推荐

