【问题标题】:Ways around ActiveRecord connection pool绕过 ActiveRecord 连接池的方法
【发布时间】:2010-09-21 15:49:54
【问题描述】:

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

  • 有一个非常大的连接池(> 1000 个连接)。
  • 每当我的 ActiveRecord 对象更改时,申请并释放数据库连接。不知道怎么做,代码示例将不胜感激。
  • 将数据写入日志文件,该文件会定期导入数据库。
  • 在单独的服务器进程上设置 Web 服务,通过 HTTP 请求接受数据并将其写入数据库。
  • 使用将数​​据发送到的消息队列。工作人员将数据导入数据库。

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

【问题讨论】:

  • 您要达到多少并发活动呼叫?

标签: ruby database activerecord asynchronous


【解决方案1】:

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

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

我们正在重新考虑 ActiveRecord 与 Adhearsion 2.0 一起使用的方式,因此将来应该不需要这个 gem。

【讨论】:

    【解决方案2】:

    Adhearsion 目前没有按照应有的方式清理签出的 ActiveRecord 连接。

    如果您在拨号方案末尾的ensure 块中调用ActiveRecord::Base.connection_pool.release_connection,您可以确保连接不会超过所需的时间。

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

    【讨论】:

    • 这就是问题所在:它是一个用于测试目的的组件,会产生大量同时调用。
    • 它产生超过1000个电话?根据您的呼叫流程,您可以向ActiveRecord::Base.connection_pool.release_connection 发出额外的呼叫,您将在拨号方案中暂停很长时间。 ActiveRecord 将在您下次需要时自动从池中获取新连接。
    猜你喜欢
    • 1970-01-01
    • 2023-01-07
    • 2023-04-02
    • 2015-09-12
    • 2011-12-06
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 2014-10-02
    相关资源
    最近更新 更多