相关疑难解决方法(0)

连接池问题与rufus-scheduler中的ActiveRecord对象有关

我正在使用rufus-scheduler来运行一些频繁的作业,这些作业使用ActiveRecord对象执行一些不同的任务.如果存在任何类型的网络或postgresql打嗝,即使在恢复之后,所有线程都会抛出以下错误,直到重新启动该进程:

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
Run Code Online (Sandbox Code Playgroud)

包装:

  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
Run Code Online (Sandbox Code Playgroud)

activerecord ruby-on-rails rufus-scheduler

15
推荐指数
2
解决办法
5532
查看次数