まず、私は Puma で Rails 3.2 を使用していますが (ただし MRI を使用しています)、手動で明示的なスレッド化を行っていません。
私はexecute
メソッドを使用している場所にいます。現在、すべての接続が同じDBに接続されているため、同じことを行うMyModel.connection.execute
ことActiveRecord::Base.connection.execute
ができます。
最近見始めた
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
これは自明のように思えますが、オンラインでほとんど情報を見つけることができません。主に、Sinatra で ActiveRecord を使用することに関するものです (ex ActiveRecord connection warning. (Database connections will not close automatically) )。
私はこれを読みました:
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
orを使うべきですか?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
ですか?接続をプールに戻しますか、それとも明示的に行う必要がありますか?
編集: 奇妙なことに、これは私の運用ログにしか表示されません。開発でもステージングでもありません(本番と同じである必要があります)。