2010-09-21 103 views
1

我在寫一個使用ActiveRecord的Adhearsion組件。問題是組件可能會運行幾分鐘(通話的長度)。在那段時間內,組件有一個ActiveRecord對象作爲實例變量。該對象使用連接池中的一個數據庫連接。根據呼叫者的數量,連接池可能會被提前耗盡。在通話過程中數據會被保存多次,但不需要立即可用。雖然使用ActiveRecord非常方便,但並不需要。我可以想象幾種解決方案,並希望徵求社區的意見,提示和替代解決方案:ActiveRecord連接池的方法

  • 有一個非常大的連接池(> 1000個連接)。
  • 每當我的ActiveRecord對象發生變化時,聲明並釋放數據庫連接。不知道該怎麼做,代碼示例將不勝感激。
  • 將數據寫入日誌文件,該日誌文件定期導入到數據庫中。
  • 在單獨的服務器進程上設置Web服務,該進程通過HTTP請求接受數據並將其寫入數據庫。
  • 使用數據發送到的消息隊列。工作人員將數據導入數據庫。

我不喜歡需要外部軟件運行(消息隊列,Web服務)的解決方案。

+0

您試圖實現多少個併發活動呼叫? – eric 2010-09-25 00:56:22

回答

1

我們已經在我們的網站上一篇博客文章中解決了這個問題:http://mojolingo.com/blog/2011/scaling-activerecord-in-adhearsion/

的博客文章解釋你是一個可能的解決方案一起看到的問題進行修復。我們還發布了一個實現所述解決方案的寶石:https://github.com/adhearsion/activerecord-wrap-with-connection

我們正在重新思考ActiveRecord與Adhearsion 2.0協同工作的方式,因此這個寶石在未來不應該是必需的。

0

Adhearsion目前沒有清理檢出ActiveRecord連接應該的方式。

如果在撥號方案結束時在ensure塊中撥打電話ActiveRecord::Base.connection_pool.release_connection,可以確保連接不會超過其所需時間。

這應該意味着您的連接池只需要與您正在處理的同時呼叫的數量一樣大。

+0

這就是問題所在:它是一個用於測試目的的組件,可以產生大量的同時呼叫。 – chiborg 2010-09-22 08:07:02

+0

它會產生超過1000個電話?根據您的呼叫流程,您可以將額外的呼叫置於'ActiveRecord :: Base.connection_pool.release_connection',您的撥號方案中會有很長的停頓時間。下次需要時,ActiveRecord會自動從池中獲取新連接。 – eric 2010-09-22 17:34:12