2012-04-17 13 views
9

私はSinatraと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') { ... } 
... 

それは動作しますが、時々私は、コンソールに警告を得る:

DEPRECATION警告:データベース接続が自動的に を閉じられませんが、 スレッドの最後にデータベース接続を閉じてください。closeに接続してください。例: ActiveRecord :: Base.connection.close '

警告が発生すると、ページが更新されるまでに時間がかかります。 接続をどこで閉じるべきか分かりません。私はファイルの末尾にActiveRecord::Base.connection.closeを入れようとしましたが、それは助けになりません。

更新:

私はまた、サーバーを再起動しなくても効果を見るためにsinatra-contrib宝石からシナトラ/リロード機能プラグインを使用することを言及するのを忘れてしまいました。

require "sinatra/reloader" 

私がコメントアウトすると、問題は消えます。しかし、とにかく、私はどのようにリローダを無効にせずに問題を取り除くのだろうかと思っています。

答えて

13

スタックにミドルウェアを追加する必要があります。答えはここにあり

use ActiveRecord::ConnectionAdapters::ConnectionManagement 

https://github.com/puma/puma/issues/59

+0

驚くばかりです。ありがとう –

13

受け入れ答えが薄い(スレッドモード)にシナトラに私のために動作しませんでした はちょうどあなたのconfig.ruまでラックファイルをこの行を追加します。私のため

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

私は私のために真実であることがわかった。なぜこれが当てはまるのですか?これを稼働させた人々にとって、あなたはサーバーのために何を使っていましたか? – PICyourBrain

+0

私はこれを試みたが、まだ私のために働いていない。 – jamesfzhang

+0

この回答は、10のdb_poolがpumaで実行されているsinatraアプリケーションで機能しました。 –

1
ActiveRecord::Base.remove_connection 

作品罰金をし、ドキュメントに記載されて:代わりに私が使用していました。

+0

どこにありますか?彼らはこのコードをどこで使うべきですか? – Adam

+1

ようこそStackOverflowへ!これは答えにはならず、おそらくコメントでなければなりません。 –

+0

@Adam http://www.rubydoc.info/gems/activerecord/5.1.0/ActiveRecord/ConnectionHandling#remove_connection-instance_method - このメソッドは、データベースが不要になったときに呼び出されます。 – ryu

関連する問題