围绕ActiveRecord连接池的方法

时间:2010-09-21 15:49:54

标签: ruby database activerecord asynchronous

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

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

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

2 个答案:

答案 0 :(得分:1)

我们在网站上的博文中提到了这个问题:http://mojolingo.com/blog/2011/scaling-activerecord-in-adhearsion/

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

我们正在重新思考ActiveRecord与Adhearsion 2.0的合作方式,因此将来不需要这个宝石。

答案 1 :(得分:0)

Adhearsion目前无法按照应有的方式清理已检出的ActiveRecord连接。

如果您在拨号方案结束时在ActiveRecord::Base.connection_pool.release_connection区块中拨打ensure,则可以确保连接不会超过他们所需的时间。

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