本記事では、JDBCTimeoutパラメーターおよび飽和状態のコネクションプールに関する詳細を紹介します。
JDBCTimeoutの仕組み
web.xmlファイルのJDBCTimeoutパラメーターは、リポジトリデータベース接続がコネクションプールからチェックアウトされる最長時間を決定するために使用されます。
データベース接続は通常、ユーザーが実行している単一のアクションに対して、コネクションプールからチェックアウトされます。チェックアウトされている間、接続に対して複数のSQLクエリーを実行することができます。
例えば、ビューを保存すると、接続をチェックアウトして、その接続におけるすべてのレコードをデータベースに書き込み、それが完了したらデータベース接続をコネクションプールへ戻します(チェックイン)。
データベース接続がJDBCTimeoutの制限を超えてチェックアウトされた場合、その接続は閉じられます。これは、その接続を使用していたすべてのプロセスを中断します。
そのため、ビューを保存するプロセスがTimeoutを超えた場合、画面にエラーが表示され、ビューを保存できなかったことを通知します。
Timeoutが長い場合の問題
Timeuoutが長い場合の問題は、時間のかかるプロセスがたくさんあるときに、これらのデータベース接続が使用中になってしまうことです。つまり、別のプロセスがデータベース接続を必要とするときには、新しい接続を開く必要がありますが、最終的には制限に達します。
データベースプールは、web.xmlのJDBCMinCountで指定された最小接続数で開始されます。ユーザー、またはバックグラウンドタスクが接続を要求した場合、コネクションプールに接続を要求します。コネクションプール内にアイドル状態の接続がある場合は、そのうちのひとつがプロセスに提供されます。プール内のすべての接続が使用中の場合は、新しい接続が作成されます。接続数がJDBCMaxCountに達するまで、必要に応じて新しい接続を作成できます。
コネクションプールが最大サイズに達した場合、これは飽和状態になります。
コネクションプールが飽和状態になると、問題が起こり始めます。すべての接続が使用中で、新しい接続が要求された場合、ユーザー、またはバックグラウンドタスクは、接続が利用可能になるまで待たなくてはいけません。つまり、他のプロセスが接続を解放するまで待つ必要があります。(最悪の場合)JDBCTimeout時間に設定された秒数待たなくてはいけない場合があります。Yellowfin ユーザーインターフェースでは、アプリケーションが応答していないように見えます。データベース接続が使用できない場合、応答は適切な時間内に返されません。
コネクションプール飽和の原因
コネクションプールは、次の3つが原因で飽和します。
- 非常に時間を要するプロセスがある - これらは主にバックグラウンドブロードキャスト、バックグラウンドキャッシュフィルター適用、バックグラウンドアクセスフィルター適用タスクです。既にTimeuot設定がデフォルトの5分から変更されている場合は、これらのタスクに関連する理由で実施された可能性があります。
アプリケーションが応答しなくなった場合、現在実行中のプロセスが「/info_threads.jsp」ダンプに表示されます。バックグラウンドタスクに関連している場合、これらが同時に発生しないように、管理し、配信することが可能です。バックグラウンドタスクに関連していない場合は、スレッドダンプに何が実行されているか表示されるはずです。 - データベースデッドロック - これは、データベース内のタイミングが原因であり、通常はコードを変更することで解消できます。
これは、2つのプロセスが同じテーブルに書き込みを行い、それぞれのプロセスがもう一方のプロセスが終了するのを待っているが、どちらも完了しない場合です。これにより、両方の接続がJDBCTimeoutで定義された全時間開いたままの状態になります。
これらの問題は、通常データベース側に見られます。その場合は、データベースクライアント側にロックが発生していないか確認した方が良いかもしれません。info Thread ダンプには、これら2つのロックされたプロセスがどこにあるのかが表示されますが、データベース側からの対応する情報でデータベースロックを確認するしかありません。 - コードデッドロック - あまり発生することはありませんが、これはコードの問題です。これを解消するには、コードを変更しなくてはいけません。
コードデッドロックは、データベースデッドロックのようなものですが、ロックはデータベースではなく、(キャッシュなどのような)Yellowfin リソース内で発生します。
この場合も、2つのプロセスがもう一方のプロセスの終了を待っていることになりますが、どちらも完了しません。このロックが発生する前にデータベース接続がチェックアウトとされている場合、その接続は解放されません。JDBC接続はJDBCTimeout後に解放されますが、コードロックは残り、他の操作をブロックする可能性もあります。これは、再起動でのみ解消できます。
接続に関しての質問や、関連する問題が発生している場合は、データベース接続に関するトラブルシューティングを参照してください。それでも解決しない場合は、Yellowfin サポートチームまでお問い合わせください。