2014-06-12 67 views
2

我在Ruby腳本中使用ActiveRecord,而不使用rails,只是運行Ruby腳本。腳本啓動訪問數據庫的線程。最終,我得到:ActiveRecord與Ruby腳本,沒有Rails,連接池超時

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)圍繞代碼的數據庫訪問部分。我仍然得到錯誤。

我在腳本中進行了一些調試,我可以看到結帳/登錄呼叫正在發生。有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來管理連接,所以如果你正在產生線程,每個線程都需要釋放一次連接。您的線程很可能不會正確清除連接,或者您產生的線程多於連接池中可用的連接數。

相關問題