我在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.checkout
和ActiveRecord::Base.connection_pool.checkin(cxn)
放在代码的数据库访问部分周围。我仍然得到错误。
我在脚本中添加了一些调试,我可以看到checkout / checkin调用正在进行中。有7个成功的结账/签到。总共有13个结账,因此有6个结账。
我也看到了:
undefined method `run_callbacks'
超时发生时。
谢谢你, 杰罗姆
答案 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来管理连接,因此如果您正在产生线程,则每个线程需要在完成它们之后释放连接。您的线程很可能无法正确清除连接,或者您产生的线程数多于连接池中可用的连接数。