我从mysql收到以下错误:
Can't create more than max_prepared_stmt_count statements (current value: 16382)
我现在已将值增加到最大值(100 万)。
我正在使用node-mysql2
但我认为无论我准备的语句计数如何最终都会达到 1M。
所以我的问题是我应该如何正确回收这些语句,以便它们不会每隔几周就不断达到 1M?
另外,如果我达到这个 1M 标记,如何同时清除此缓存?
我的节点/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 的副本服务器
希望您已经找到了回复。
我在准备好的语句中看不到这一点,即使我在使用每次更改单个参数时都不同的请求时看到了它(在 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配置。