6

まず、私は 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.closeorを使うべきですか?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ですか?接続をプールに戻しますか、それとも明示的に行う必要がありますか?

編集: 奇妙なことに、これは私の運用ログにしか表示されません。開発でもステージングでもありません(本番と同じである必要があります)。

4

1 に答える 1

4

この場合、接続を手動で閉じる必要があります。

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

after do
  ActiveRecord::Base.connection.close
end
于 2013-10-05T12:21:44.937 に答える