代码之家  ›  专栏  ›  技术社区  ›  chiborg Alessandro Minoccheri

绕过ActiveRecord连接池的方法

  •  1
  • chiborg Alessandro Minoccheri  · 技术社区  · 14 年前

    我在写一篇 Adhearsion 使用ActiveRecord的组件。问题是组件可能运行了几分钟(调用的长度)。在此期间,组件将ActiveRecord对象作为实例变量。此对象使用连接池中的一个数据库连接。根据调用方的数量,连接池可能会过早耗尽。在通话过程中,数据会保存多次,但不需要立即可用。虽然使用ActiveRecord非常方便,但不需要它。我可以想象出几种解决方案,我想征求社区的意见、建议和其他解决方案:

    • 拥有非常大的连接池(>1000个连接)。
    • 每次更改ActiveRecord对象时声明并释放数据库连接。不知道如何做到这一点,我们会欣赏代码示例。
    • 将数据写入定期导入数据库的日志文件。
    • 在单独的服务器进程上设置Web服务,该进程通过HTTP请求接受数据并将其写入数据库。
    • 使用将数据发送到的消息队列。工人将数据导入数据库。

    我不喜欢需要运行外部软件的解决方案(消息队列、Web服务)。

    2 回复  |  直到 13 年前
        1
  •  1
  •   Ben Klang    13 年前

    我们在我们的网站上的一篇博客文章中解决了这个问题: http://mojolingo.com/blog/2011/scaling-activerecord-in-adhearsion/

    博客文章解释了你所看到的问题,以及一个可能的解决方法。我们还发布了一个gem来实现所描述的解决方案: https://github.com/adhearsion/activerecord-wrap-with-connection

    我们正在重新考虑ActiveRecord与Adhiersion 2.0的工作方式,因此将来不需要使用此宝石。

        2
  •  0
  •   eric    14 年前

    Adhearsion当前无法按其应该的方式清除签出的ActiveRecord连接。

    如果你打电话 ActiveRecord::Base.connection_pool.release_connection 在一个 ensure 阻止在您的拨号计划结束时,您可以确保连接不再保持在他们需要的任何时间。

    这意味着您的连接池只需要和您正在处理的同时调用的数量一样大。