我正在编写一个使用ActiveRecord的Adhearsion组件。问题是组件可能运行几分钟(呼叫的长度)。在此期间,组件将ActiveRecord对象作为实例变量。此对象使用连接池中的一个数据库连接。根据呼叫者的数量,连接池可能会过早耗尽。在通话期间,数据会多次保存,但不需要立即可用。虽然使用ActiveRecord非常方便,但不需要它。我可以想象几个解决方案,并希望从社区中寻求意见,提示和替代解决方案:
我不喜欢需要外部软件运行的解决方案(消息队列,Web服务)。
答案 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
,则可以确保连接不会超过他们所需的时间。
这应该意味着您的连接池只需要与您正在处理的同时呼叫数量一样大。