首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >max_prepared_stmt_count错误,如何回收准备好的语句?

max_prepared_stmt_count错误,如何回收准备好的语句?
EN

Stack Overflow用户
提问于 2018-01-05 22:42:36
回答 1查看 2.2K关注 0票数 3

我从mysql中得到以下错误:

Can\'t create more than max_prepared_stmt_count statements (current value: 16382)

目前,我已将该值增加到最大值(100万)。

我使用的是node-mysql2,但我认为无论我的预准备语句数量最终会达到1M。

所以我的问题是,我应该如何正确地回收这些语句,使它们不会每隔几周就达到1M?

另外,如果我命中这个1M大关,我如何在此期间清除此缓存?

我的node/mysql2代码如下:

代码语言:javascript
复制
import mysql from 'mysql2/promise'
const pool = mysql.createPool({ host, port, connectionLimit: 100 })
export default pool

然后,我在任何地方都使用这个池,并使用预准备语句:

代码语言:javascript
复制
pool.execute('SELECT * FROM ... etc etc')

我猜保持100个连接并重用它们会导致预准备语句最终达到最大值。我在node/mysql2中看到了一个未记录的特性,即maxPreparedStatements,我可以将它添加到配置中。这会阻止未来的问题吗?或者我仍然必须时不时地在mysql中“清除准备好的语句”(如果是这样的话,清除它的命令是什么)?

请注意,我有3台副本服务器连接到mysql

EN

回答 1

Stack Overflow用户

发布于 2020-11-27 02:08:50

希望你已经找到了回复。

我在预置语句中看不到这一点,即使我在使用请求时看到了这一点,每次都有一个参数发生变化(在JS中构建sql请求字符串...)。

您确定使用的是预准备语句吗?

您的请求应如下所示:

代码语言:javascript
复制
pool.execute('SELECT * FROM ... where id = ? etc etc', [id, ...])

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

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

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

代码语言:javascript
复制
show variables where `variable_name` like  '%stmt%';
show status where `variable_name` like  '%stmt%';

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48115829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档