我如何解决 MySQL 中的“max_user_connections”问题?

Posted

技术标签:

【中文标题】我如何解决 MySQL 中的“max_user_connections”问题?【英文标题】:How i can fix a 'max_user_connections' reached problem in MySQL? 【发布时间】:2021-05-22 22:37:13 【问题描述】:

我使用一个名为 Mochahost 的部署平台,我通常将我的 war 文件放在服务器上来部署我的 Spring Boot 应用程序,就像我往常一样。

但最近,我在部署过程中遇到了这个错误:

[mysqluser] 已经有超过 'max_user_connections' 个活动连接

有没有人知道在部署应用时会发生什么,为什么同时有这么多连接,而我只是在部署应用而不是插入数据?

该项目是一个 SparingBoot 应用程序,因此我默认使用 HikariCP 作为连接池。 我是唯一连接到数据库的用户。

我没有声明一些 JPA 持久性单元。

这里是mvn clean install的日志

2021-02-21 14:50:40.153 INFO 4792 --- [task-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 开始...

2021-02-21 14:50:42.173 INFO 4792 --- [task-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 启动完成。

2021-02-21 14:50:42.235 INFO 4792 --- [task-1] org.hibernate.dialect.Dialect:HHH000400:使用方言:org.hibernate.dialect.MySQL5Dialect

2021-02-21 14:50:42.306 INFO 4792 --- [main] DeferredRepositoryInitializationListener:触发 Spring Data 存储库的延迟初始化?

2021-02-21 14:50:49.147 INFO 4792 --- [task-1] ohetjpiJtaPlatformInitiator:HHH000490:使用 JtaPlatform 实现:[org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]

2021-02-21 14:50:49.226 信息 4792 --- [任务 1] j.LocalContainerEntityManagerFactoryBean :初始化的 JPA 持久性单元“默认”的 EntityManagerFactory 2021-02-21

14:50:50.349 信息 4792 --- [主要] DeferredRepositoryInitializationListener :Spring 数据存储库 已初始化!

2021-02-21 14:50:50.382 信息 4792 --- [主要] c.d.q.q.QuizzJavaSpringApplicationTests : 开始 QuizzJavaSpringApplicationTests in 15.982 seconds (JVM running for 17.371)[信息]测试运行:1,失败:0,错误:0,跳过:0,经过的时间:17.176 s - in com.douineau.qjsbr.quizzjavaspring.QuizzJavaSpringApplicationTests

2021-02-21 14:50:51.047 信息 4792 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean :关闭 JPA 持久性单元“默认”的 EntityManagerFactory

2021-02-21 14:50:51.058 INFO 4792 --- [extShutdownHook] os.s.concurrent.ThreadPoolTask​​Executor:正在关闭 ExecutorService 'applicationTaskExecutor'

2021-02-21 14:50:51.061 INFO 4792 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 已启动关闭...

2021-02-21 14:50:51.109 INFO 4792 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 关闭完成。

提前感谢您的支持。

【问题讨论】:

确保重新使用或关闭连接。 【参考方案1】:

max_user_connections 表示有太多“用户”* 试图连接到您的 mysql 服务器。

虽然可以将您的服务器配置为允许更多连接,如下所述:https://dev.mysql.com/doc/refman/8.0/en/user-resources.html 我检查了您在客户端中使用的设置(您的 java 代码和可能的通道池(CP)配置,很可能在 *.properties 文件中)。 您的 CP 可以配置为具有更多实际上不需要的连接(连接与 RPS 不同),因此一种选择是尽可能减少客户端的连接数。 这次您可能会看到此错误而您过去没有看到它的另一个原因是水平可伸缩性?是不是过去你在 N 个服务器上运行你的代码,而现在你正在使用 N+M 个服务器?在这种情况下,从 java-client 到您的 mysql 服务器的连接总数将再次增加,您有 2 个选项:增加与服务器的最大允许连接数,或者,如果合理,减少客户端的连接数(java 应用程序)代码生成mysql。

*"users" - 你可以有多个可以连接到 mysql 的用户。您饱和用户 A 的最大连接数这一事实并不意味着用户 B 将无法连接。因此,如果您在不同的应用程序中重复使用相同的 mysql 用户来连接到 mysql,您可以为每个应用程序设置一个专用用户。

更新:

来自 mysql 文档:

任何给定 MySQL 用户帐户允许的最大同时连接数。值 0(默认值)表示“无限制”。 这个变量有一个全局值,可以在服务器启动或运行时设置。它还有一个只读会话值,指示适用于与当前会话关联的帐户的有效同时连接限制。会话值初始化如下: 如果用户帐户具有非零 MAX_USER_CONNECTIONS 资源限制,则会话 max_user_connections 值设置为该限制。 否则,会话 max_user_connections 值将设置为全局值。 帐户资源限制使用 CREATE USER 或 ALTER USER 语句指定。请参阅第 6.2.20 节,“设置帐户资源限制”。

【讨论】:

我在 mysql 中做了一个 -- SHOW VARIABLES LIKE "max_connections" -- 设置为 10 000。我认为它足够大,我的代码可能有问题,但我没有'不明白为什么部署时有这么多连接。 我使用 Spring boot,所以 CP 由 HikariCP 管理。可能我必须设置一个 EntityManager 吗?

以上是关于我如何解决 MySQL 中的“max_user_connections”问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 Kettle 中的这个 in/out mysql 参数错误?

如何解决 PHP 和 MySQL 中的 UTF-8/Unicode 问题 [关闭]

如何解决错误:Laravel-MySql 中的 SQL 身份验证方法未知

如何解决 MySql 中的 PARTITION BY 语法错误

我应该如何审计 MySQL 表中的更改(使用 MySQL 4)?

MySQL数据库中的中文乱码如何解决