2013-08-17 112 views
5

首先,我在Puma上使用Rails 3.2(但是使用MRI),并且没有手动执行任何明确的线程。ActiveRecord执行SQL需要关闭连接吗? DEPRECATION警告:数据库连接不会自动关闭

我在使用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与辛纳屈(前ActiveRecord connection warning. (Database connections will not be closed automatically))。

我这样说的:

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

这表明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.closeMyModel.clear_active_connections!作为文章建议?也许因为英语不是我的第一语言,但这种方法听起来很危险!我该如何去做呢?

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

那样?

使用find_by_sql时怎么样?它会将连接返回到池中,还是我必须明确地执行此操作?

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

回答

7

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

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

after do 
    ActiveRecord::Base.connection.close 
end 
+1

这是哪种情况?当从模型中做到这一点?装饰?帮手?这不是一次性的脚本,但是,这是连续运行的... –

+0

您可以在模型中创建一个方法,并在要关闭连接的执行代码的末尾调用它。该方法有上面的代码,所以无论何时被调用,连接都可以关闭。 – Mehul

+1

我问的是_when_我需要这样做 - 从模型中查询时?从装饰者?从帮手?你说“并在执行代码结束时调用它” - 哪个执行代码是? –