mysql - Rails 保持数据库连接时间过长,无法运行存储过程

标签 mysql ruby-on-rails stored-procedures rds

我的 Rails 和 MySQL RDS 实例遇到问题。我的 Rails 应用程序通过我们的 database.yml 文件连接到它,并有 10 个(现在是 5 个)连接池。有一天,数据库的另一个用户尝试运行存储过程,但它无法执行。它只是闲逛等待执行。用户查看了进程,注意到我们的 Rails 用户有大约 30 个空闲进程,因此他们杀死了其中一些进程。存储过程随后启动并运行没有问题。

我们使用的是 r3.xlarge 实例,出现问题时总共有约 100 个进程。对我来说,这似乎并没有高得惊人,而且我不确定为什么在不释放某些进程的情况下该过程无法执行。我想我的问题是,有没有办法告诉我的 Rails 应用程序在 x 秒后释放一些空闲连接,或者有办法更好地控制这些连接?我可以编写一个 cron 来释放它们,但我很乐意以 Rails/最好的方式来做。

感谢您的帮助!

最佳答案

在我看来,您可能已经达到了 MySQL 实例的最大连接限制。您可以在 MySQL 上运行 select @@max_connections 来找出限制。

我不知道有什么方法可以强制 Rails 关闭其分配的数据库连接。 每个服务器进程最多可以使用池大小连接(即在您的情况下为10或5)到数据库的线程。线程和进程之间的区别很重要:例如,如果您有多个工作线程作为单独的进程运行为您的 Rails 应用程序提供服务(例如 puma 可以这样配置),则每个进程最多可以分配 5 或 10 个连接。如果您使用后台进程(sidekiq 等),它们也可能会使用最多此数量的连接。

ConnectionPool 还提供 reaper可以用来从线程中释放分配的数据库连接,但除非您的应用程序遇到一些更大的问题,否则这通常不会有帮助(您的线程更有可能空闲而不是< em>死了)。

因此,我会给出一般建议,尝试估计所有 Rails 进程可能需要的最大连接数,如果它接近或高于 MySQL 连接限制,请降低连接池大小或减少数量可能运行的 Rails 进程(工作进程)。

如果您需要更多帮助,请指定您使用什么应用程序服务器来运行 Rails 应用程序以及它的配置方式,对于任何后台作业工作人员也是如此。

关于mysql - Rails 保持数据库连接时间过长,无法运行存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37139128/

相关文章:

mysql - 为什么我的存储过程不使用我传递给它的参数? - MySQL

.net - 启用排序和分页的 T-SQL 存储过程无法正常工作

php - 在 PHP 中连续删除记录

mysql - 使用 mysql 在 Ubuntu 上安装 Sonar

php - 如何用sql排序

jquery - 首先隐藏 div 然后切换复选框以显示和隐藏相同的 div

ruby-on-rails - rake db :seed, 预填充数据库时出错。未初始化的常量 Clients_courses

ruby-on-rails - 如何将登录表单放在 Devise 和 Rails 的标题中

没有语法错误时出现 MySQL 1064 语法错误

mysql - MySQL 事件调度程序是全局的吗?