現在プール内にあるすべてのデータベース接続を一覧表示することはできますか?
概要
Rails アプリから独立して実行されるデーモンで ActiveRecord::ConnectionTimeoutError が発生します。私は、Passenger と Apache および MySQL をデータベースとして使用しています。
乗客のデフォルトのプール サイズは 6 (少なくともドキュメントにはそう記載されています) なので、6 つを超える接続を使用すべきではありません。
デーモンに必要な接続は 1 つだけだと思っていましたが、ActiveRecord のプール サイズを 10 に設定しました。私のデーモンは、複数のスレッドを持つ 1 つのプロセスであり、あちこちで ActiveRecord を呼び出し、Rails アプリと共有するデータベースに情報を保存します。
私が理解する必要があるのは、スレッドが単に 1 つの接続を共有できないのか、それとも古い接続を解放せずに新しい接続を要求し続けるのかということです。プール サイズを増やして問題を延期できることはわかっていますが、デーモンには数百のスレッドが存在する可能性があるため、遅かれ早かれプールの接続が不足します。
まず最初に知りたいのは、Passenger は実際に 6 つの接続を使用しているだけであり、問題はデーモンにあるということです。それをテストするにはどうすればよいですか?
次に、すべてのスレッドに独自の接続が必要なのか、それともすでに持っている接続を再利用するように指示するだけでよいのかを判断したいと思います。もし彼らが自分自身のつながりを必要とするなら、それを使っていないときはそれを保持しないように指示するだけでよいのではないでしょうか?結局のところ、スレッドはほとんどの時間スリープ状態になっています。
解決策
ActiveRecord::Base.connection_handler.connection_pools を通じて、ActiveRecord が使用している接続プールにアクセスできます。これは接続プールの配列である必要があります。おそらくそこには 1 つだけがあり、そこに接続メソッドがあります。認識している接続の配列を取得します。
ActiveRecord::Base.connection_handler.connection_pools.each(&:clear_stale_cached_connections!) を実行することもでき、スレッドがすでに生きていないチェックアウトされた接続をチェックインします。
それが役立つのか、それともさらに混乱させるのかわかりません