大佬教程收集整理的这篇文章主要介绍了ruby-on-rails – 在rufus-scheduler中使用ActiveRecord对象的连接池问题,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
ActiveRecord :: ConnectionTimeoutError(无法在5秒内获取数据库连接(等待5.000122687秒).最大池大小当前为5;请考虑增加它.
通过重新启动POSTGRes可以轻松地复制错误.我已经尝试玩(最多15)与游泳池的大小,但没有运气在那里.
这导致我相信连接只是处于一个陈旧的状态,我认为这将会调用clear_stale_cached_connections!
有更可靠的模式吗?
传递的块是一个简单的选择和更新活动记录调用,恰好是AR对象的重要事件.
rufus工作:
scheduler.every '5s' do db do DataFeed.update #standard AR SELEct/update end end
包装:
def db(&block) begin ActiveRecord::Base.connection_pool.clear_stale_cached_connections! #ActiveRecord::Base.establish_connection # this didn't Help either way yield block rescue Exception => e raise e ensure ActiveRecord::Base.connection.close if ActiveRecord::Base.connection ActiveRecord::Base.clear_active_connections! end end
当你的线程还没有连接时,它会从池中获得一个连接.
(如果池中的所有连接都在使用中,它将等待,直到另一个线程返回,最终超时并抛出ConnectionTimeoutError)
当您完成此操作后,您有责任将其返回到池中,在Rails应用程序中,这是自动完成的.但是,如果你正在管理自己的线程(像rufus那样),你必须自己去做.
幸运的是,有一个api为此:
如果将代码放在一个with_connection块中,它将从池中获取连接,并在完成后释放它
ActiveRecord::Base.connection_pool.with_connection do #your code here end
在你的情况下
def db ActiveRecord::Base.connection_pool.with_connection do yield end end
应该做的伎俩….
以上是大佬教程为你收集整理的ruby-on-rails – 在rufus-scheduler中使用ActiveRecord对象的连接池问题全部内容,希望文章能够帮你解决ruby-on-rails – 在rufus-scheduler中使用ActiveRecord对象的连接池问题所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。