我从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
然后我随处使用池中的预备语句la:
pool.execute('SELECT * FROM ... etc etc')
我猜测持有100个连接并重用它们会导致准备好的语句最终达到最大值。我在node / mysql2中看到一个未记录的功能,它表示maxPreparedStatements
我可以添加到配置中。这会在未来阻止这个问题吗?或者我还是要不时地在mysql中“清除准备好的语句”(如果是这样的话,清除它的命令是什么情况)?
注意我有3个连接到mysql的副本服务器
答案 0 :(得分:0)
希望您已经找到了答复。
即使在使用请求时每次看到单个参数都不同时(在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配置。