我正在学习rails数据库连接池的概念。在rails应用程序中,我定义了池大小为5。
我对连接池大小的理解如下。
但我的问题是,如果我一次按1000次请求,那么大部分请求将无法访问数据库连接,因为我的连接池大小只有5。
我对rails连接池的上述理解是对的吗?
谢谢,
发布于 2015-12-18 08:28:58
目的:
数据库连接不是线程安全的;因此ActiveRecord对每个线程使用单独的数据库连接。
限制因素:
数据库连接总量受您使用的数据库服务器(例如Posgres:缺省值通常为100或更小。)、应用服务器配置(可用进程/线程数)和活动记录配置的限制:连接池默认为5。
泳池大小:
活动记录的池大小为单个进程。线程从这个池中使用一个连接,然后自动释放它。(除非您自己生成一个线程,否则您将不得不手动释放它)。如果应用程序在多个进程上运行,则每个进程都有5个数据库连接。如果您的服务器同时被1000个请求击中,它将在这些连接之间分发请求,当这些连接满时,其余的请求将等待它们的出现。
请参阅更多:
https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html
发布于 2015-12-18 07:58:51
是的,从医生那里:
连接池使线程访问有限数量的数据库连接同步。基本思想是,每个线程从池中签出一个数据库连接,使用该连接,并签入连接。ConnectionPool是完全线程安全的,只要正确遵循ConnectionPool的约定,就会确保两个线程不能同时使用连接。它还将处理线程多于连接的情况:如果所有连接都已签出,并且线程无论如何都会尝试签出连接,那么ConnectionPool将等待其他线程签入连接。
来源:http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html
如果您使用独角兽之类的东西作为http服务器:
在Unicorn中,每个进程都建立自己的连接池,所以如果db池设置为5,并且有5个Unicorn工作人员,则最多可以有25个连接。但是,由于每个独角兽工作者一次只能处理一个连接,那么除非应用程序内部使用线程,否则每个工作人员实际上只能使用一个db连接。
https://stackoverflow.com/questions/34350406
复制相似问题