2012-04-17 127 views
9

我試圖創建西納特拉和ActiveRecord的(3.2.3)一個小應用程序(數據庫連接不會被自動關閉)。ActiveRecord連接警告。

這是我的主文件看起來像:

require "sinatra" 
require "sinatra/reloader" 
require "active_record" 
... 

ActiveRecord::Base.establish_connection(
    adapter: 'sqlite3', 
    database: 'db.sqlite3', 
    host:  'localhost', 
) 

class Post < ActiveRecord::Base 
    ... 
end 

get('/') { ... } 
get('/posts') { ... } 
... 

它的工作原理,但有時我得到在控制檯的警告:

棄用警告:數據庫連接不會被自動關閉 ,請通過在您的連接上撥打close關閉 線程末尾的數據庫連接。例如: ActiveRecord :: Base.connection.close'

當發生警告時,頁面刷新需要很長時間。 我不明白我應該關閉連接的位置。我試圖把ActiveRecord::Base.connection.close放在文件的底部,但它沒有幫助。

更新:

我忘了提及,我也用西納特拉/ reloader插件從sinatra-contrib寶石來看看效果,無需重新啓動服務器。

require "sinatra/reloader" 

如果我發表評論,那麼問題就會消失。但無論如何,我想知道如何擺脫這個問題,而不禁用reloader。

回答

13

你需要一箇中間件添加到您的堆棧。 只是這行添加到您的config.ru架起來的文件:

use ActiveRecord::ConnectionAdapters::ConnectionManagement 

找到答案在這裏:https://github.com/puma/puma/issues/59

+0

太棒了。謝謝 – 2012-09-03 04:08:45

13

接受的答案並沒有西納特拉爲我工作的薄(線程模式)。相反,我用:

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

我發現對我來說也是如此。任何人都知道爲什麼會這樣?對於那些確實已經開始工作的人來說,你對服務器使用了什麼? – PICyourBrain 2013-03-20 17:54:45

+0

我試過但仍然不適合我。 – jamesfzhang 2013-12-31 18:41:16

+0

這個答案適用於在puma上運行的db_pool爲10的sinatra應用程序。 – 2015-03-17 00:56:43

1
ActiveRecord::Base.remove_connection 

工作正常,我和在文檔中列出。

+0

在文檔中的位置?他們應該在哪裏使用這些代碼? – Adam 2017-05-08 19:51:47

+1

歡迎來到StackOverflow!這不合格作爲答案,可能應該是一個評論。 – 2017-05-08 20:05:43

+0

@Adam http://www.rubydoc.info/gems/activerecord/5.1.0/ActiveRecord/ConnectionHandling#remove_connection-instance_method - 該方法時,不再需要數據庫的調用。 – ryu 2017-05-12 07:59:16