当您使用ActiveRecord::Base.connection.execute(sql_string)
时,是否应该在结果上调用clear
以释放内存?
在this podcast的19:09,发言人(在Active Record上做过大量工作的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
更有可能导致内存问题吗?
答案 0 :(得分:5)
这取决于适配器。请记住,Rails不能控制execute
返回的对象。如果您正在使用PostgreSQL,那么您将获得PG::Result
,并使用mysql2
适配器,您将获得Mysql2::Result
。
对于PG(记录为here),您需要调用clear
,除非autoclear?
返回true或者您将收到内存泄漏。如果您有足够大的结果集以确保在清理之前不会导致内存问题,您可能还需要手动拨打clear
。
Mysql2似乎没有通过Ruby API公开其free
,并且似乎总是在GC期间自我清理。