0

接続プールの有効期限が切れた後、プールで許可されている最大接続数よりも多くの接続を並行して開こうとすると、プールから接続を取得しようとするとタイムアウト例外が発生し始めます。

それは予想されますが、プールはその状態のままになっているようで、その瞬間以降に行った他のすべての操作で同じタイムアウト例外が発生します。プール内の各接続がビジー状態のままで、再利用できないかのように。時間の経過とともに接続が解放され、他の接続が許可されることを期待していますが、これは起こっていません.

Play 1.2.5 と mysql への jdbc ドライバーを使用しています。ログから、プールは C3P0 だと思います。

プールを使用するときに行うのが正しいと信じているため、接続を明示的に閉じているわけではありませんが、100%確実ではありません。

これが私が使用しているフレームワーク/ライブラリのいずれかでの接続リークであるかどうか、または私が何か間違ったことをしているのか、それともすべきことをしていないのかはわかりません.

タイムアウト例外の 1 つをキャッチした場合、どうすればよいですか?

4

1 に答える 1

2

接続プールを使用する場合は、明示的に接続を閉じる必要があります。接続プールには、データベースへの物理接続のコレクションがあります。プールから接続を要求すると、その物理接続が使用中としてマークされ、その接続への論理ハンドルが渡されます。この論理ハンドルは基本的に、ほとんどのメソッド呼び出しを (直接または変更して) 物理接続に転送するラッパーまたはプロキシです。

close()この論理ハンドルを呼び出すと、接続プールは物理接続が再び使用可能になった (つまり、プールに戻すことができる) という信号を受け取ります。それ以降、論理ハンドルは閉じられた接続として動作しますが、実際の物理接続は接続はまだ開いています。を呼び出さないとclose()、接続プールはこのシグナルを受信しないため、物理接続は使用中のままなり、再利用できなくなります。

一部の高度なプール構成では、プールがこの状況を検出し (たとえば、タイムアウトを使用したり、ファイナライザーを使用したりするなど)、接続を再利用できますが、それに依存するべきではありません。

TL ;DR:close()接続プール、プールされていない、DataSourceまたはDriverManager.

于 2013-01-17T16:51:59.677 に答える