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

时间:2015-12-18 07:25:06

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

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

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

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

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

  3. 但我的问题是,如果我一次点击1000个请求,那么大多数请求都无法访问数据库连接,因为我的连接池大小只有5个。

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

    谢谢,

2 个答案:

答案 0 :(得分:11)

此池大小适用于单个进程。当然,如果您的应用程序在多个进程上运行,那么每个进程将有5个数据库连接。如果您的服务器同时遇到1000个请求,它将在这些连接中分发请求,当它满了时,其余的请求等待轮到他们。

答案 1 :(得分:10)

是的,来自文档:

  

连接池将线程访问权限同步到有限数量   数据库连接。基本思路是每个线程检出一个   池中的数据库连接,使用该连接和检查   重新连接.ConnectionPool完全是线程安全的   将确保连接不能被两个线程使用   同时,只要正确遵循ConnectionPool的合同。   它还将处理线程数多于的情况   连接:如果已检出所有连接,则为一个线程   尝试检查连接,然后ConnectionPool将等待   直到某个其他线程检查了连接。

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

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

  

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