2015-10-20 55 views
4

當您使用ActiveRecord::Base.connection.execute(sql_string)時,您應該致電clear以釋放內存?在執行原始SQL之後應該調用PG :: Result#clear嗎?

this podcast 19:09,揚聲器(Rails的提交者誰也做了很多的活動記錄工作)說,如果我們使用ActiveRecord::Base.connection.execute,我們應該叫clear的結果,或者我們應該使用方法ActiveRecord::Base.connection.execute_and_clear ,這需要一個塊。

(他是在方法名有點不清楚。爲MySQL適配器的方法是free和Postgres的適配器的方法是clear。他還提到release,但該方法不存在。)

我的理解是,他的說法,我們應該改變

result = ActiveRecord::Base.connection.execute(sql_string).to_a 
process_result(result) 

ActiveRecord::Base.connection.execute_and_clear(sql_string, "SCHEMA", []) do |result| 
    process_result(result) 
end 

result = ActiveRecord::Base.connection.execute(sql_string) 
process_result(result) 
result.clear 

該播客是我聽過這個說法的唯一地方,我找不到有關它的任何其他信息。我正在使用的Rails應用程序在很多情況下使用execute而沒有clear,我們不知道由此導致的任何問題。在某些情況下,未能致電clear更有可能導致記憶問題?

回答

5

這取決於適配器。請記住,Rails不控制由execute返回的對象。如果你使用的是PostgreSQL,你會得到一個PG::Result,並使用mysql2適配器,你會得到一個Mysql2::Result

對於PG(記錄爲here),您需要撥打clear,除非autoclear?返回true,否則您將收到內存泄漏。如果您有足夠大的結果集以確保在清理之前不會導致內存問題,您可能還想手動撥打clear

Mysql2似乎沒有通過Ruby API公開它的free,並且似乎總是在GC期間自行清理。

相關問題