【问题标题】:Is there any reason to use a database connection pool with ActiveRecord?是否有任何理由将数据库连接池与 ActiveRecord 一起使用?
【发布时间】:2011-04-29 10:53:25
【问题描述】:

使用外部连接池有什么好处?

我听说大多数其他应用程序都会为每个工作单元打开一个连接。例如,在 Rails 中,我认为这意味着每个请求都可以打开一个新连接。我假设连接池可以做到这一点。

我能想到的唯一好处是它允许您拥有 1,000 个前端进程而无需运行 1,000 个 postgres 进程。

还有其他好处吗?

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord connection-pooling


    【解决方案1】:

    Rails 有 connection pooling built in:

    1. 只需将 ActiveRecord::Base.connection 用于 Active Record 2.1 及更早版本(预连接池)。最终,当您完成连接并希望将其返回到池中时,您调用 ActiveRecord::Base.clear_active_connections!。当与 Action Pack 的请求处理周期结合使用时,这将是 Active Record 的默认行为。
    2. 使用 ActiveRecord::Base.connection_pool.checkout 从池中手动签出连接。完成后,您有责任通过调用 ActiveRecord::Base.connection_pool.checkin(connection) 将此连接返回到池中。
    3. 使用 ActiveRecord::Base.connection_pool.with_connection(&block),它获取一个连接,将其作为唯一参数传递给块,并在块完成后将其返回到池中。

    这已提供since version 2.2。您将在 database.yml 中看到用于控制它的 pool 参数:

    pool:表示连接池大小的数字(默认5)

    我认为在其下分层另一个池系统没有多大意义,如果您尝试它甚至可能会混淆 AR 的池。

    【讨论】:

    • AR 的连接池只对同一进程中的多个线程有用。外部连接池可让您在多个进程之间进行池化。
    • @Joe:你是在回答自己的问题吗?这是允许的。
    猜你喜欢
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    相关资源
    最近更新 更多