max_prepared_stmt_count错误,如何回收预处理语句?

时间:2018-01-05 14:42:36

标签: mysql node-mysql2

我从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的副本服务器

1 个答案:

答案 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配置。