首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rails数据库连接池的工作原理

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

Stack Overflow用户
提问于 2015-12-18 07:25:05
回答 2查看 22.3K关注 0票数 30

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

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

  1. 当服务器启动rails自动创建database.yml文件中定义的n个连接数时。在我的例子中,它将创建5个连接,因为池大小为5。
  2. 对于每个http请求,如果需要访问数据库,那么rails将使用来自连接池的可用连接来服务请求。

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

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

谢谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-18 08:28:58

目的:

数据库连接不是线程安全的;因此ActiveRecord对每个线程使用单独的数据库连接。

限制因素:

数据库连接总量受您使用的数据库服务器(例如Posgres:缺省值通常为100或更小。)、应用服务器配置(可用进程/线程数)和活动记录配置的限制:连接池默认为5。

泳池大小:

活动记录的池大小为单个进程。线程从这个池中使用一个连接,然后自动释放它。(除非您自己生成一个线程,否则您将不得不手动释放它)。如果应用程序在多个进程上运行,则每个进程都有5个数据库连接。如果您的服务器同时被1000个请求击中,它将在这些连接之间分发请求,当这些连接满时,其余的请求将等待它们的出现。

请参阅更多:

https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html

票数 31
EN

Stack Overflow用户

发布于 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连接。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34350406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档