3

我从 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

然后,我在任何地方都使用准备好的语句 a la 的池:

pool.execute('SELECT * FROM ... etc etc')

我猜想持有 100 个连接并重用它们会导致准备好的语句最终达到最大值。我在 node/mysql2 中看到一个未记录的功能,说maxPreparedStatements我可以添加到配置中。这会防止将来出现这个问题吗?还是我仍然需要不时在mysql中“清除准备好的语句”(如果是这种情况,清除它的命令是什么)?

注意我有 3 个连接到 mysql 的副本服务器

4

1 回答 1

1

希望你已经找到了回应。

我没有在准备好的语句中看到这一点,即使我在使用每次更改单个参数时都不同的请求时看到了它(在 JS 中构建 sql 请求字符串......)。

你确定你使用的是准备好的陈述吗?

您的请求应如下所示:

pool.execute('SELECT * FROM ... where id = ? etc etc', [id, ...])

我正在测试https://www.npmjs.com/package/mysql2 v2.2.5。

以这种方式提出您的所有要求。也许在开发服务器上激活 mysql 日志以检查正在发出的请求。

很好的 mysql 调试请求在 mysql cli 中执行:

show variables where `variable_name` like  '%stmt%';
show status where `variable_name` like  '%stmt%';

重要的值是 Prepared_stmt_count 状态和 max_prepared_stmt_count 配置。

于 2020-11-26T18:08:49.753 回答