繁体   English   中英

rails 数据库连接池的工作原理

[英]How rails database connection pool works

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

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

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

  2. 在每个 http 请求上,如果需要访问数据库,那么 rails 将使用连接池中的可用连接来为请求提供服务。

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

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

谢谢,

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

限制因素:
数据库连接总数受您使用的数据库服务器(例如 Posgres: 默认通常为 100 或更少)、应用服务器的配置(可用进程/线程数)和 Active Record 的配置的限制: 连接池默认为 5 。

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

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

是的,来自文档:

连接池将线程访问同步到有限数量的数据库连接。 基本思想是每个线程从池中检出一个数据库连接,使用该连接,然后检入该连接。 ConnectionPool 是完全线程安全的,将确保一个连接不能被两个线程同时使用,只要正确遵循 ConnectionPool 的合同。 它还将处理线程数多于连接数的情况:如果所有连接都已签出,并且一个线程无论如何都试图签出一个连接,那么 ConnectionPool 将等待某个其他线程签入一个连接。

来源: http : //api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html

如果你使用像 unicorn 这样的东西作为 http 服务器:

在 Unicorn 中,每个进程都建立自己的连接池,因此如果您的数据库池设置为 5 并且您有 5 个 Unicorn 工作人员,那么您最多可以拥有 25 个连接。 但是,由于每个 unicorn worker 一次只能处理一个连接,除非您的应用程序在内部使用线程,否则每个 worker 实际上只会使用一个 db 连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM