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

Pat*_*ois 5 postgresql activerecord memory-leaks ruby-on-rails

当你使用时ActiveRecord::Base.connection.execute(sql_string),你应该调用clear结果以释放内存吗?

这个播客的 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)
Run Code Online (Sandbox Code Playgroud)

ActiveRecord::Base.connection.execute_and_clear(sql_string, "SCHEMA", []) do |result|
  process_result(result)
end
Run Code Online (Sandbox Code Playgroud)

要么

result = ActiveRecord::Base.connection.execute(sql_string)
process_result(result)
result.clear
Run Code Online (Sandbox Code Playgroud)

播客是我听到这个声明的唯一地方,我找不到任何其他相关信息.我正在使用的Rails应用程序在execute没有clear多个实例的情况下使用,我们不知道由它引起的任何问题.在某些情况下,未能通话clear更有可能导致记忆问题吗?

sgr*_*rif 5

这取决于适配器.请记住,Rails不控制返回的对象execute.如果你正在使用PostgreSQL,你会得到一个PG::Result,并使用mysql2适配器,你会得到一个Mysql2::Result.

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

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