我从mysql中得到以下错误:
Can\'t create more than max_prepared_stmt_count statements (current value: 16382)
目前,我已将该值增加到最大值(100万)。
我使用的是node-mysql2,但我认为无论我的预准备语句数量最终会达到1M。
所以我的问题是,我应该如何正确地回收这些语句,使它们不会每隔几周就达到1M?
另外,如果我命中这个1M大关,我如何在此期间清除此缓存?
我的node/mysql2代码如下:
import mysql from 'mysql2/promise'
const pool = mysql.createPool({ host, port, connectionLimit: 100 })
export default pool然后,我在任何地方都使用这个池,并使用预准备语句:
pool.execute('SELECT * FROM ... etc etc')我猜保持100个连接并重用它们会导致预准备语句最终达到最大值。我在node/mysql2中看到了一个未记录的特性,即maxPreparedStatements,我可以将它添加到配置中。这会阻止未来的问题吗?或者我仍然必须时不时地在mysql中“清除准备好的语句”(如果是这样的话,清除它的命令是什么)?
请注意,我有3台副本服务器连接到mysql
发布于 2020-11-27 02:08:50
希望你已经找到了回复。
我在预置语句中看不到这一点,即使我在使用请求时看到了这一点,每次都有一个参数发生变化(在JS中构建sql请求字符串...)。
您确定使用的是预准备语句吗?
您的请求应如下所示:
pool.execute('SELECT * FROM ... where id = ? etc etc', [id, ...])我正在测试https://www.npmjs.com/package/mysql2 v2.2.5。
用这种方式提出你所有的请求。也许可以在开发服务器上激活mysql日志来检查正在发出的请求。
要在mysql cli中执行的mysql调试请求:
show variables where `variable_name` like '%stmt%';
show status where `variable_name` like '%stmt%';重要的值包括Prepared_stmt_count状态和max_prepared_stmt_count配置。
https://stackoverflow.com/questions/48115829
复制相似问题