ActiveRecord执行SQL需要关闭连接吗?DEPRECATION警告:数据库连接不会自动关闭



首先,我在彪马上使用Rails 3.2(但使用MRI),并且没有手动执行任何显式线程。

我在使用execute方法的地方,比如MyModel.connection.execute,或者我知道ActiveRecord::Base.connection.execute可以做同样的事情,因为现在所有的连接对我来说都是到同一个DB的。

我最近开始看到

DEPRECATION WARNING: Database connections will not be closed automatically, please close your database connection at the end of the thread by calling `close` on your connection. For example ActiveRecord::Base.connection.close

这似乎不言自明,但我在网上几乎找不到关于它的信息,主要是关于将ActiveRecord与Sinatra一起使用的信息(例如ActiveRecord连接警告。(数据库连接不会自动关闭))。

我读到这个:

http://blog.daniel-azuma.com/archives/216

这表明,只要DB执行事务是在控制器中完成的(如果我理解正确的话),Rack中间件就会为我做这件事。这是否意味着在其他地方完成的事务(例如模型或装饰器——它们在很多地方都很有用,所以我不想把它们放在一个控制器中)必须显式关闭?即使这是一种从控制器调用的模型方法,例如:

class MyController
  def show
    MyModel.do_execute_sql_stuff
  end
end
class MyModel
  def self.do_execute_sql_stuff
    connection.execute("WHATEVER;")
  end
end

我需要在这里明确关闭吗?如果是,我应该像文章建议的那样使用MyModel.connection.close还是MyModel.clear_active_connections!?也许是因为英语不是我的第一语言,但这种方法听起来很危险!我该怎么做?

conn = MyModel.connection
result = conn.execute("STUFF")
do_stuff_with(result)
conn.close |or| MyModel.clear_active_connections!

像那样?

使用find_by_sql时会怎样?它会将连接返回到池吗?还是我必须明确地这样做?

编辑:奇怪的是,我只在我的生产日志中看到这一点。不在开发阶段,也不在阶段(这应该与生产完全相同)。

在这种情况下,您需要手动关闭连接。

运行完脚本后,您可以像这样手动关闭它。

after do
  ActiveRecord::Base.connection.close
end

最新更新