在执行原始SQL后,是否应该调用PG :: Result#clear?

时间:2015-10-20 23:09:33

标签: ruby-on-rails postgresql activerecord memory-leaks

当您使用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更有可能导致内存问题吗?

1 个答案:

答案 0 :(得分:5)

这取决于适配器。请记住,Rails不能控制execute返回的对象。如果您正在使用PostgreSQL,那么您将获得PG::Result,并使用mysql2适配器,您将获得Mysql2::Result

对于PG(记录为here),您需要调用clear,除非autoclear?返回true或者您将收到内存泄漏。如果您有足够大的结果集以确保在清理之前不会导致内存问题,您可能还需要手动拨打clear

Mysql2似乎没有通过Ruby API公开其free,并且似乎总是在GC期间自我清理。