8

このエラーが発生します:

'could not obtain a database connection within 5 seconds (waited 5.001017 seconds). The max pool size is currently 16; consider increasing it.'

最初にこのエラーが発生し、カウントを5から16に増やしました。しかし、それはまだ発生しており、データベースをテストするのは私だけです。私が唯一のユーザーであるのに、なぜこれが起こるのですか?

ところで、私はレールに乗っていない。使ってます:

ActiveRecord::Base.establish_connection ({
    :adapter => 'mysql2',
    :database => 'ck',
    :host => 'localhost',
    :username => 'root',
    :password => '',
    :pool => 16,
    })

シナトラを使用しています。

ありがとう

4

4 に答える 4

12

Frederickが指摘したように、開いているActiveRecord接続を接続プールに戻す必要があります。

スレッドモードでシンサーバーを使用している場合は、これをSinatraアプリに追加する必要があります。

after do
  ActiveRecord::Base.connection.close
end

...ConnectionManagementの提案を使用する代わりに。その理由は、Thinがリクエスト処理を2つのスレッドに分割し、ActiveRecord接続を閉じているスレッドがそれを開いたスレッドと同じではないためです。ActiveRecordはスレッドIDで接続を追跡するため、混乱して接続を正しく返しません。

于 2013-02-16T10:02:42.123 に答える
5

リクエストの最後にプールへの接続を返さないようです。そうでない場合、dbを使用する各リクエストは1つの接続を消費し、最終的にはプールを使い果たし、説明したエラーメッセージの取得を開始します

Active Recordは、これを処理するためのラックミドルウェアを提供します。これActiveRecord::ConnectionAdapters::ConnectionManagementは、アクティブレコードにアクセスするものよりもミドルウェアチェーンの早い段階で処理を行う必要があります。

接続管理は自分で行うこともできます。ドキュメントには詳細がありますが、それを行う1つの方法は、すべてのdbアクセスをこのようなブロックに固定することです。

ActiveRecord::Base.connection_pool.with_connection do
  ...
end

これは、ブロックの開始時に接続をチェックアウトし、後でチェックインし直します。

于 2012-12-03T02:06:51.167 に答える
1

ActiveRecordで提供されるミドルウェアを使用することをお勧めします。

use ActiveRecord::ConnectionAdapters::ConnectionManagement
于 2014-05-21T07:11:34.600 に答える
0

Frederickが指摘したように、開いているActiveRecord接続を接続プールに戻す必要があります。

kuwertyが示唆しているように、Thinを使用している場合ConnectionManagement、プールへの接続は返されません。kuwertyが言うように現在の接続を閉じる代わりに、そのように接続をプールに戻すことをお勧めします。

after do
  ActiveRecord::Base.clear_active_connections!
end

問題を再現したい場合は、この例を試してください。

編集:

ミドルウェアの使用ActiveRecord::Connectionadapters::ConnectionManagementがスレッドモードのThinで機能しない理由を説明しました。これは、ここにあります。

于 2016-04-20T22:27:55.230 に答える