mysql - Rails 数据库连接池的工作原理

标签 mysql ruby-on-rails ruby ruby-on-rails-3 connection-pooling

我正在学习 Rails 数据库连接池概念。在 Rails 应用程序中,我将池大小定义为 5。

我对连接池大小的理解如下。

  1. 当服务器启动时,rails 会自动创建 n 个在 database.yml 文件中定义的连接。在我的例子中,它将创建 5 个连接,因为池大小为 5。

  2. 在每个 http 请求上,如果需要访问数据库,rails 将使用连接池中的可用连接来处理请求。

但我的问题是,如果我一次达到 1000 个请求,那么大部分请求将无法访问数据库连接,因为我的连接池大小只有 5 个。

我上面对rails连接池的理解对吗??

谢谢,

最佳答案

目的:
数据库连接不是线程安全的;所以 ActiveRecord 为每个线程使用单独的数据库连接。

限制因素:
总数据库连接数受限于您使用的数据库服务器(例如 Posgres:default is typically 100 or lesser)、您的应用程序服务器的配置(可用的进程/线程数)和 Active Record 的配置:Connection Pool默认为 5 。

池大小:
Active Record 的池大小适用于单个进程。线程使用此池中的连接并在之后自动释放它。 (除非您自己生成一个线程,否则您必须手动释放它)。如果您的应用程序在多个进程上运行,则每个进程将有 5 个数据库连接。如果您的服务器同时受到 1000 个请求的攻击,它将在这些连接之间分配请求,当它变满时,其余的请求等待轮到它们。

阅读更多:
https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html

关于mysql - Rails 数据库连接池的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34350406/

相关文章:

php - Ninja 表单使用 SQL/PHP 填充选择

ruby-on-rails - Rails 4.1 - ActionController::RoutingError(没有路由匹配 [GET] "/fonts/....ttf") - @font-face 问题

ruby-on-rails - 如何检查所有页面是否响应成功

ruby - 如何将 `:rand` 用作 map/collect 的一元方法?

Javascript 元素 id 到 AJAX url

php - 显示结果表 SQL

ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字

ruby - 在 Ruby On Rails 的类变量中缓存文件

mysql - 如何在 MySQL 中使用 Coalesce

mysql - 我应该将排序键字段与外键结合索引,还是单独索引(mysql)?