質問
MySQLと通信するためにApache Tomcatの接続プールを使用するアプリケーションに取り組んでいます。なぜあなたはより小さなものを使いたいのかと思っていました wait_timeout デフォルトの28,800秒よりも?待機タイムアウトを減らすことには多くの欠点がありますが、利点は何ですか?
背景
パラメータ wait_timeout と定義されている
サーバーが非対話型接続を閉じる前に、その接続のアクティビティを待機する秒数。
問題
Wait_timeoutを小さくしすぎると、MySQLは、私のWebアプリケーションが使用している接続プールでまだ有効な接続を強制終了します。私の状況では、いつでもアプリケーションを現在使用している唯一の人なので、テストしていないときは当然、db接続はアイドル状態になります。 MySQLのwait_timeoutを非常に大きなものに拡張するだけでこの問題を解決できるため、2週間デスクから離れていても、プールがデッド接続を返さないようにすることができます。
あなたはwait_timeoutをうまく拡張する必要があります
MySQLのwait_timeoutの最大値に注意してください 5. 、 5.1 、 5.5 、 5.6
これらの最大値はmysqldには存在しなかったため、それらを処理できませんでした。
接続プールは、代わりにオーバーヘッドを節約するだけです。つまり、新しいDB接続用のメモリを破棄して再割り当てします。これにより、DBサーバーのOSがメモリをより多く交換するために、より多くのスワッピングを行う可能性があります。
私はこれについて1年以上前に書きました: DB接続の開閉はどれくらいコストがかかりますか?
PHPおよびDB接続用のApacheオブジェクトはまだインスタンス化されているので、DB接続が早期に警告なしで終了することを決定しているため、wait_timeoutを下げると、Apacheが混乱する可能性があります。その場合、 netstat
をスキャンしてTIME_WAIT
ポート3306またはMySQLが使用している任意のポートを介した接続。
May 20, 2011
: MySQLが動的にデータをキャッシュする理由PHPサイト?Aug 17, 2011
: 接続が多すぎますOct 26, 2011
: PHPとMySQLの間で奇妙なクエリタイムアウトを引き起こしている原因は何ですか?Feb 27, 2012
: MySQL接続数がクエリ数よりはるかに多いそのようなものが存在し、Apacheが新しい接続を開くのを妨げている場合は、自分でTIME_WAITを強制終了する必要があります。私のFeb 01, 2012
ServerFault post MySQLがwait_timeoutの値を下げて開いている接続の数を減らす 方法。
接続プーリングのないWebアプリがあるとします。
次に、Webアプリが接続をリークするとします(たとえば、Javaでfinallyブロックを使用しないことにより、接続を適切に閉じません)。待ち時間の長いタイムアウト(デフォルトは8時間)を使用すると、接続の漏れははるかに問題になります。アプリはすぐに接続を使い果たします(mysqlの「Too many connections」エラー)。
典型的なWebアプリでは、1つのhttpリクエストのスコープ内で接続が開閉されます。したがって、接続は数秒間以上必要ありません。待機タイムアウトを短くすると、コードを修正しなくても、「接続が多すぎる」という問題を解消できます。
そうは言っても、正しい解決策は、コードを修正してリークのある接続を排除することです。
テストをまったく行わないことは、非常に高速なアプローチであり、必ずしも最もスケーラブルであるとは限りません。参照しているドキュメントは、接続の信頼性よりも速度を優先するアプリの場合でも、アイドル接続の不定期のテストに推奨されていることに注意してください:「かなり長いidleConnectionTestPeriod
を設定し、チェックアウトとチェックインをまったくテストしないことは、優れた高性能アプローチ。"
プールが非常に大きい場合を除いて、かなり長い時間は約300秒程度です。 (接続テストはミリ秒のオーダーで行われるため、特に効率的なpreferredTestQuery
を設定する場合、特に5分ごとに50のオーバーヘッドは非常に低くなります(これを試してくださいSELECT 1
MySqlで。)
c3p0は、接続タイムアウトを処理するためのたくさんのツールを提供します-接続テストスキームは、タイムアウトした接続をパージします。テストしない場合は、構成パラメーターmaxIdleTime
またはmaxConnectionAge
を使用できます。