データベース接続のチューニング
接続プールアーキテクチャー
Jira がデータベースにアクセスする (読み込みまたは書き込みを行う) 必要がある際は、データベース接続が必要になります。
データベース接続は複雑で大規模なオブジェクトで、JIRA とそのデータベース間のすべての通信を処理します。したがって、データベース接続の確立は時間のかかる処理であり、クライアント (Jira アプリケーション) とデータベース サーバーの両方で大量のメモリーを消費します。
Jira のデータベース アクセス リクエストに対して毎回新しいデータベース接続を確立すると発生する高負荷な処理を回避するために、事前に確立済みのテータベース接続プールが維持されます。Jira からの新たなデータベース アクセス リクエストのたびに、この事前に確立済みのテータベース接続プールからコネクションが使用されます。この結果、次のようになります。
- Jira の起動時にはプール内において Jira とデータベース間の最小限のデータベース コネクションが確立されます。
- Jira がデータベースにアクセスする必要がある際は、次のような処理が行われます。
- プールに対してデータベース接続を要求します
- そのデータベース接続を使用してデータベースの読み出しまたは書き込みを行います
- 処理が終了するとデータベース接続をプールに戻す
Jira のデータベース アクセス リクエストの頻度がプールで利用可能な接続数を超え始めた場合は、負荷を処理するために接続が自動で作成されます。
逆に、Jira のデータベース アクセス リクエストの頻度がプールで利用可能なデータベース接続数を下回り始めると、接続を自動で閉じてリソースをシステムに返すようにできます。
最近のデータベースは十分なメモリーさえあれば数百の接続を比較的簡単に処理できますが、クライアント側ではこれらの接続は大量のメモリーを消費します。そのため、最大接続数をそれよりずっと小さい数に制限して、接続する必要が生じたアプリケーションが待つことなく接続を利用できるようにするのが一般的です。
Jira のデータベース接続をチューニング
- Jira インストールをシャットダウンします。
- 次のいずれかのオプションを選択して進めます。
- Jira 設定ツールによって Jira のデータベース接続を調整します。
- Jira ホーム ディレクトリのルートにある
dbconfig.xml
ファイルを編集します。
Jira 設定ツールによって Jira のデータベース接続を調整します。
- 次の手順で Jira 設定ツールを起動します。
- Windows: コマンド プロンプトを開いて、Jira インストール ディレクトリの
bin
サブディレクトリにあるconfig.bat
を実行します。 Linux/Unix: コンソールを開いて、Jira インストール ディレクトリの
bin
サブディレクトリにあるconfig.sh
を実行します。このコマンドは「No X11 DISPLAY 変数が原因で Jira アプリケーション設定ツールを起動できなかったのは、設定エラーによるもの」に記載のエラーで失敗する場合があります。その場合は、この記事の回避策をご参照ください。
Jira 設定ツールを実行するには、JAVA_HOME
環境変数を設定する必要が生じる場合があります。詳細については「Java のインストール」をご参照ください。 - Windows: コマンド プロンプトを開いて、Jira インストール ディレクトリの
- Jira 設定ツールが起動したら [詳細] タブをクリックします。
このタブで利用可能なオプションの詳細については「接続プールの設定」をご参照ください。これらのオプションの値を指定するには、先にその一番左のチェックボックスをチェックする必要があります。
前のスクリーンショットのいくつかのオプションは単純なチェックボックスです。これらのチェックボックスをチェックするとそれに関連するオプションの値が「true」に、逆にチェックを外すとそれに関連するオプションの値が「false」に設定されます。
- 変更を保存します。これらは要素として
dbconfig.xml
ファイルに保存されます。
dbconfig.xml ファイルを編集して Jira のデータベース接続を開始する
次の手順に従って、Jira ホーム ディレクトリのルートにある dbconfig.xml
ファイルを編集します。
- Jira のデータベース接続を微調整するために
dbconfig.xml
ファイルに追加できる要素の詳細については「接続プールの設定」をご参照ください。 - 編集済みの
dbconfig.xml
ファイルを保存します。 - Jira インストールを再起動します。
DBCP 設定
- 設定の既定値は、次のいずれかが実行された後に
dbconfig.xml
ファイルに書き込まれます。 - Jira セットアップ ウィザードを実行した。
- すべてのオプションで左端のチェックボックスをチェックしていない場合でも、Jira 設定ツールの [詳細設定] タブによってデータベース接続を設定した。
- 設定の既定値で注記「dbconfig.xml で指定されていない場合」が表示された場合は、次のいずれかを意味します。
- Jira セットアップ ウィザードを実行した後、関連要素が
dbconfig.xml
ファイルに書き込まれなかった。 - 次のいずれかの方法で、関連要素が
dbconfig.xml
ファイルに書き込まれた。 - 担当ユーザーが手動で書き込んだ。
- 左端のチェックボックスをチェックしてこれらのオプションの値を設定することで、[詳細設定] タブのオプションに従って指定された。
- 設定の既定値で注記「dbconfig.xml で指定されていない場合」が表示された場合は、dbconfig.xml ファイルに存在しなくてもシステムはこの値を考慮します。
次の表に、すべての接続プール設定とその構成を示します。
Jira 設定ツールの [詳細] タブ オプション | | 説明 | 推奨事項/注意事項 | デフォルト値* |
最大サイズ |
| いつでもオープンできるデータベース接続の最大数。 | Jira がデータベース コネクション要求を送信したときに待機する必要がないよう、十分に大きい値を設定する必要があります。 このパラメーターの設定方法は「接続プールの監視」セクションをご参照ください。 | 20 |
最大アイドル状態 |
| プール内でアイドル状態のまま保持可能なデータベース接続の最大数。 | この値を負に設定すると、プール内でアイドル状態のまま存在可能なデータベース接続の最大数は無制限になります。 Minimum Idle/Size (下記参照) の値が Maximum Size (上述の設定) の値と同一の場合 (初期設定では同一) は、この設定は無意味になります。 | Maximum Size の値 |
最小アイドル状態/サイズ |
( | 同時にオープンしているアイドル状態のデータベース接続の最小数。 | この値を Maximum Size (上述の設定) と同一にすると (初期設定では同一)、プールにおける接続数は一定でアイドル接続は絶対に切断されません。 非常に大きな Jira インストールでは、この設定を Maximum Size よりも小さな値に指定することでリソースが節約できる場合があります。 | Maximum Size の値 |
初期サイズ |
| プール内でオープンされるデータベース接続の初期値。 | Jira の起動時に多数のデータベース コネクションが迅速に作成されるため、この値は通常は (0 以外に) 設定しません。 | 0 |
最大待機時間 |
| プールに空きコネクションがない場合に、データベース コネクションが利用可能となるまでに Jira が待機する最大時間 (単位はミリ秒)。これを過ぎるとエラーが通知されます。 | 「-1」の値を指定すると Tomcat の待ち時間は無期限になります。 この値は競合が発生してもそれに対応できるほど長い時間にする必要があると同時に、無応答やブラウザー タイムアウトになる前にユーザーに対して有意義なエラー情報を提供できるほど短い時間にする必要があります。 | 30000 |
高度な設定通常、次の設定は変更不要です。必要に応じて Apache DBCP ドキュメントをご参照ください。 | ||||
プールステートメント |
| データベース接続プールにおいてプリペアドステートメントのプーリングを有効にします。 | false | |
最大オープンステートメント |
| ステートメントプールから同時に割り当て可能な空きステートメントの最大数。 | 例外の原因となるため、既定値は修正しないでください。 | 0 |
バリデーションクエリ |
| 接続プールから取り出された接続の検証を行う SQL クエリです。指定する場合、クエリは少なくとも1つの行を返す SQL SELECT 文でなければなりません。 | 詳細については、 コネクション切断の問題を乗り越える方法 を参照してください。 | select 1 (または、 |
バリデーションクエリのタイムアウト |
| 検証クエリがデータベース接続の破損を検出するまでのシステム待ち時間 (単位は秒)。 | 検証クエリは処理量の小さいものを使用するためこの時間は非常に短い時間で構いません。 上記で Validation Query を指定した場合は Validation Query Timeout の値も指定する必要があります。指定しないと「-1」の値が設定されて、データベースの破損が発生していなくてもシステムは破損を無期限に待ち続けます。 これは MySQL にのみ行います。MySQL 以外のデータベースでバリデーション クエリ タイムアウトを使用すると、Jira インスタンスに重大な問題が発生します。 | 3 (または、 |
借りるときにテスト |
| Jira がデータベース コネクション プールからデータベース コネクションを借りたときに、それが正しく機能するかどうかをテストします。 そのデータベース接続が破損している場合はプールから削除されます。 | Jira はデータベース処理のたびに接続を流用するため、この値は常に「false」にする必要があります。 テータベース接続をうまく閉じれない問題が定常的に発生する場合は、このオプションを「true」にしてみてください。ただし、この方法は Time Between Eviction Runs の値を小さくしてもデータベース接続を閉じる際の問題の発生を防止も軽減もできない場合の最終手段としてください。
| True ( |
返却時にテスト |
| Jira がデータベース コネクション プールにデータベース コネクションを返却したときに、それが正しく機能するかどうかをテストします。 そのデータベース接続が破損している場合はプールから削除されます。 | Jira はデータベース処理のたびに流用した接続を返却するため、この値は常に「false」にする必要があります。 | false |
アイドル状態にテスト |
| データベース接続がアイドル状態のときに正しく機能しているか否かを定期的にテストします。 そのデータベース接続が破損している場合はプールから削除されます。 | MySQL の場合はこれを「true」に設定する必要があります。 初期設定では、MySQL データベース サーバーは、データベース接続が長期間使用されていなければデータベース接続を閉じます。Jira はアクティブに動作しない時間が長時間 (一晩など) に及ぶことが多いため、MySQL を利用している場合は問題が発生します。これを「true」にすることでこの動作を回避できます。 なお、Test While Idle の指定が必要となるのは、上で説明した Validation Query を指定したときのみです。 | true false |
追い出し実行間の時間 |
| アイドルオブジェクトのエビクションスレッド実行間隔 (単位はミリ秒)。ゼロまたは負の値を指定するとアイドルオブジェクトのエビクションスレッドは実行されません。 エビクションスレッドは、アイドル状態にあるデータベース接続数が上で説明した Minimum Idle/Size を超えたときにアイドル状態にあるデータベース接続を削除します。 | MySQL の場合、接続のエビクションとテストを正常に行うためにはこのパラメーターを大きめの正の値に設定します。一般的に妥当な値は300000 (5 分) です。 テータベース接続のクローズがうまくいかないという問題が定常的に発生する場合はこのオプション値を小さめにしてみてください。
| 300000 5000 (または、 |
追い出し可能な最小限のアイドル時間 |
| アイドルオブジェクトのエビクションを実行する場合に、データベース接続プール内のオブジェクトがアイドルオブジェクトエビクションの対象となるまでのアイドル状態最小時間。 | 60000 4000 (または、 | |
クローズ漏れの削除 |
| データベース接続のクローズ漏れ状態が次の Removed Abandoned Timeout で指定した時間を超えたときにそれを削除するか否かのフラグ。 内部エラーが発生した場合、Jira が借りたコネクションが返されないことがあります。これが頻繁に起こると、プール内のデータベース コネクションが不足し、Jira のパフォーマンス低下や完全な動作停止を引き起こす恐れがあります。 | この値は「true」に設定する必要があります。 これによってプールで対象から漏れた接続を回復して、システム パフォーマンスの低下を防止します。 | true |
クローズ漏れの削除のタイムアウト |
| データベース接続がクローズ漏れと判定されるまでのアイドル状態継続時間 (単位は秒)。 | 300 |
接続プールの監視
Jira ではデータベース接続の使用状況を [データベース監視] ページで確認できます。詳細は「データベース接続使用率の監視」をご参照ください。