ActiveRecord与Ruby脚本,没有Rails,连接池超时

时间:2014-06-12 15:12:43

标签: ruby activerecord

我在Ruby脚本中使用ActiveRecord,而不使用rails,只运行Ruby脚本。该脚本启动访问数据库的线程。最终,我得到了:

could not obtain a database connection within 20.000 seconds

database configuration:
The pool is set for 10 connection.  The timeout is set for 20 seconds.

我试过没有直接使用连接轮询调用,但是我不清楚应该如何管理它。所以我将cxn = ActiveRecord::Base.connection_pool.checkoutActiveRecord::Base.connection_pool.checkin(cxn)放在代码的数据库访问部分周围。我仍然得到错误。

我在脚本中添加了一些调试,我可以看到checkout / checkin调用正在进行中。有7个成功的结账/签到。总共有13个结账,因此有6个结账。

我也看到了:

undefined method `run_callbacks'

超时发生时。

谢谢你, 杰罗姆

1 个答案:

答案 0 :(得分:2)

您需要显式释放连接回ActiveRecord连接池。您需要显式调用ActiveRecord::Base.clear_active_connections!或者定义 一个辅助方法,它执行以下操作:

def with_connection(&block)
  ActiveRecord::Base.connection_pool.with_connection do
    yield block
  end
end

您将使用如下:

def my_method

  with_connection do
    User.where(:id => 1)
  end
end

,当块退出时,它应该释放你的连接。

警告ActiveRecord使用当前的线程ID来管理连接,因此如果您正在产生线程,则每个线程需要在完成它们之后释放连接。您的线程很可能无法正确清除连接,或者您产生的线程数多于连接池中可用的连接数。