2013-08-17 1 views
5

まず、Puma(でもMRI)のRails 3.2を使用していますが、明示的にスレッドを実行していません。ActiveRecordは接続を閉じるためにSQLを実行する必要がありますか? DEPRECATION警告:データベース接続は自動的に閉じられません

MyModel.connection.executeのような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 

を見始め

これは自明と思われるが、私はほとんどシナトラ(EX ActiveRecord connection warning. (Database connections will not be closed automatically))とのActiveRecordを使用する方法については、オンラインそれにはほとんど情報を見つけることができます。

私はこれを読んで:

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

をラックミドルウェアは限りDBは(私が正しく理解していれば)トランザクションは、コントローラで行われている実行すると私のためにそれをしないことを示唆しています。これは、他の場所で行われているトランザクション(モデルやデコレータなど)は、明示的に閉じなければならないということですか?それは、コントローラ、元から呼び出されたそれをしないモデル法だ場合でも:

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を使用するとどうなりますか?それはプールへの接続を返しますか、それとも明示的に行う必要がありますか?

EDIT:奇妙なことに、これは私のプロダクションログにのみ表示されます。開発中でもステージングでもない(生産と同一でなければならない)

答えて

7

この場合接続を手動で終了する必要があります。

スクリプトを実行した後、これを手動で閉じることができます。

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

どの場合ですか?モデルからやっているとき?デコレータ?ヘルパー?しかし、これはスクリプトではありませんが、これは継続的に実行されています... –

+0

モデル内でメソッドを作成し、実行コードの最後に接続を終了する場所で呼び出すことができます。そのメソッドは上記のコードを持っているので、呼び出されるといつでも接続を閉じることができます。 – Mehul

+1

私は何を求めているのですか?私はこれを行う必要がありますか?モデルから質問するときですか?デコレータから?ヘルパーから?あなたは「あなたの実行コードの終わりに呼んでください」と言います - 実行コードはそれですか? –

関連する問題