2010-09-21 59 views
1

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

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

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

+0

您试图实现多少个并发活动呼叫? – eric 2010-09-25 00:56:22

回答

1

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

的博客文章解释你是一个可能的解决方案一起看到的问题进行修复。我们还发布了一个实现所述解决方案的宝石:https://github.com/adhearsion/activerecord-wrap-with-connection

我们正在重新思考ActiveRecord与Adhearsion 2.0协同工作的方式,因此这个宝石在未来不应该是必需的。

0

Adhearsion目前没有清理检出ActiveRecord连接应该的方式。

如果在拨号方案结束时在ensure块中拨打电话ActiveRecord::Base.connection_pool.release_connection,可以确保连接不会超过其所需时间。

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

+0

这就是问题所在:它是一个用于测试目的的组件,可以产生大量的同时呼叫。 – chiborg 2010-09-22 08:07:02

+0

它会产生超过1000个电话?根据您的呼叫流程,您可以将额外的呼叫置于'ActiveRecord :: Base.connection_pool.release_connection',您的拨号方案中会有很长的停顿时间。下次需要时,ActiveRecord会自动从池中获取新连接。 – eric 2010-09-22 17:34:12