データベース接続のチューニング

Jira は Apache Commons DBCP に基づく DBCP (データベース接続プール) によって、基盤となるデータベースへの Jira のアクセスを管理します。

Jira の以前のバージョンでは、データベース コネクション プールは Jira を実行している Apache Tomcat アプリケーション サーバー経由でのみ処理されていました。

Jira バージョン 4.4 以降では Jira の dbconfig.xml ファイルが一連のデータベース接続プール設定を Tomcat に渡して、Tomcat がそれを利用して Jira のデータベース接続プールを管理するようになっています。

Jira バージョン 5.1 以降では、Jira の dbconfig.xml ファイルで定義できるデータベース接続プールの設定数が大幅に増えました。

このページでは、Jira のデータベース接続プールを調整する方法を説明します。Jira 設定ツールを使用する方法と、Jira の dbconfig.xml ファイルを直接編集する方法があります (以降のセクション参照)。

Jira のデータベース接続プールの設定と管理には、Jira 設定ツール詳細タブを使用することをお勧めします。データベース監視ページ (Jira システム管理者がアクセス可能) には、Jira のデータベース接続の使用状況を視覚的に監視するツールが用意されています。

このページの内容

接続プールアーキテクチャー

Jira がデータベースにアクセスする (読み込みまたは書き込みを行う) 必要がある際は、データベース接続が必要になります。

データベース接続は複雑で大規模なオブジェクトで、JIRA とそのデータベース間のすべての通信を処理します。したがって、データベース接続の確立は時間のかかる処理であり、クライアント (Jira アプリケーション) とデータベース サーバーの両方で大量のメモリーを消費します。

Jira のデータベース アクセス リクエストに対して毎回新しいデータベース接続を確立すると発生する高負荷な処理を回避するために、事前に確立済みのテータベース接続プールが維持されます。Jira からの新たなデータベース アクセス リクエストのたびに、この事前に確立済みのテータベース接続プールからコネクションが使用されます。この結果、次のようになります。

  1. Jira の起動時にはプール内において Jira とデータベース間の最小限のデータベース コネクションが確立されます。
  2. Jira がデータベースにアクセスする必要がある際は、次のような処理が行われます。
    1. プールに対してデータベース接続を要求します
    2. そのデータベース接続を使用してデータベースの読み出しまたは書き込みを行います
    3. 処理が終了するとデータベース接続をプールに戻す

Jira のデータベース アクセス リクエストの頻度がプールで利用可能な接続数を超え始めた場合は、負荷を処理するために接続が自動で作成されます。

逆に、Jira のデータベース アクセス リクエストの頻度がプールで利用可能なデータベース接続数を下回り始めると、接続を自動で閉じてリソースをシステムに返すようにできます。

最近のデータベースは十分なメモリーさえあれば数百の接続を比較的簡単に処理できますが、クライアント側ではこれらの接続は大量のメモリーを消費します。そのため、最大接続数をそれよりずっと小さい数に制限して、接続する必要が生じたアプリケーションが待つことなく接続を利用できるようにするのが一般的です。

Jira のデータベース接続をチューニング

  1. Jira インストールをシャットダウンします。
  2. 次のいずれかのオプションを選択して進めます。

Jira 設定ツールによって Jira のデータベース接続を調整します。

  1. 次の手順で Jira 設定ツールを起動します。
    Jira 設定ツールを実行するには、JAVA_HOME 環境変数を設定する必要が生じる場合があります。詳細については「Java のインストール」をご参照ください。
  2. Jira 設定ツールが起動したら [詳細] タブをクリックします。
    Jira 設定ツール。
  3. このタブで利用可能なオプションの詳細については「接続プールの設定」をご参照ください。これらのオプションの値を指定するには、先にその一番左のチェックボックスをチェックする必要があります。

    前のスクリーンショットのいくつかのオプションは単純なチェックボックスです。これらのチェックボックスをチェックするとそれに関連するオプションの値が「true」に、逆にチェックを外すとそれに関連するオプションの値が「false」に設定されます。

  4. 変更を保存します。これらは要素として dbconfig.xml ファイルに保存されます。

dbconfig.xml ファイルを編集して Jira のデータベース接続を開始する

次の手順に従って、Jira ホーム ディレクトリのルートにある dbconfig.xml ファイルを編集します。

  1. Jira のデータベース接続微調整するために dbconfig.xml ファイルに追加できる要素の詳細については「接続プールの設定」をご参照ください。
  2. 編集済みの dbconfig.xml ファイルを保存します。
  3. Jira インストールを再起動します。

DBCP 設定

  • 設定の既定値は、次のいずれかが実行された後に dbconfig.xml ファイルに書き込まれます。
    • Jira セットアップ ウィザードを実行した。
    • すべてのオプションで左端のチェックボックスをチェックしていない場合でも、Jira 設定ツールの [詳細設定] タブによってデータベース接続を設定した
  • 設定の既定値で注記「dbconfig.xml で指定されていない場合」が表示された場合は、次のいずれかを意味します。 
    • Jira セットアップ ウィザードを実行した後、関連要素が dbconfig.xml ファイルに書き込まれなかった
    • 次のいずれかの方法で、関連要素が dbconfig.xml ファイルに書き込まれた。
      • 担当ユーザーが手動で書き込んだ。
      • 左端のチェックボックスをチェックしてこれらのオプションの値を設定することで、[詳細設定] タブのオプションに従って指定された。
  • 設定の既定値で注記「dbconfig.xml で指定されていない場合」が表示された場合は、dbconfig.xml ファイルに存在しなくてもシステムはこの値を考慮します。

次の表に、すべての接続プール設定とその構成を示します。

Jira 設定ツールの [詳細] タブ オプション

 dbconfig.xml の要素

説明 

推奨事項/注意事項

デフォルト値*

最大サイズ

pool-max-size

いつでもオープンできるデータベース接続の最大数。

Jira がデータベース コネクション要求を送信したときに待機する必要がないよう、十分に大きい値を設定する必要があります。

このパラメーターの設定方法は「接続プールの監視」セクションをご参照ください。

20

最大アイドル状態

pool-max-idle

プール内でアイドル状態のまま保持可能なデータベース接続の最大数。

この値を負に設定すると、プール内でアイドル状態のまま存在可能なデータベース接続の最大数は無制限になります。

Minimum Idle/Size (下記参照) の値が Maximum Size (上述の設定) の値と同一の場合 (初期設定では同一) は、この設定は無意味になります。

Maximum Size の値

最小アイドル状態/サイズ

pool-min-size

(min-idle)

同時にオープンしているアイドル状態のデータベース接続の最小数。

この値を Maximum Size (上述の設定) と同一にすると (初期設定では同一)、プールにおける接続数は一定でアイドル接続は絶対に切断されません。

非常に大きな Jira インストールでは、この設定を Maximum Size よりも小さな値に指定することでリソースが節約できる場合があります。

Maximum Size の値

初期サイズ

pool-initial-size

プール内でオープンされるデータベース接続の初期値。

Jira の起動時に多数のデータベース コネクションが迅速に作成されるため、この値は通常は (0 以外に) 設定しません。

0
(dbconfig.xml で指定されていない場合)

最大待機時間

pool-max-wait

プールに空きコネクションがない場合に、データベース コネクションが利用可能となるまでに Jira が待機する最大時間 (単位はミリ秒)。これを過ぎるとエラーが通知されます。

「-1」の値を指定すると Tomcat の待ち時間は無期限になります。

この値は競合が発生してもそれに対応できるほど長い時間にする必要があると同時に、無応答やブラウザー タイムアウトになる前にユーザーに対して有意義なエラー情報を提供できるほど短い時間にする必要があります。

30000

高度な設定

通常、次の設定は変更不要です。必要に応じて Apache DBCP ドキュメントをご参照ください。

プールステートメント

pool-prepared-statements

データベース接続プールにおいてプリペアドステートメントのプーリングを有効にします。

例外が発生する可能性があるため false の既定値を変更しないでください。詳細は JRA-44908 - 課題情報を取得中... ステータスをご参照ください。

false
(dbconfig.xml で指定されていない場合)

最大オープンステートメント

max-open-prepared-statements

ステートメントプールから同時に割り当て可能な空きステートメントの最大数。

例外の原因となるため、既定値は修正しないでください

0
(dbconfig.xml で指定されていない場合)

バリデーションクエリ

validation-query

接続プールから取り出された接続の検証を行う SQL クエリです。指定する場合、クエリは少なくとも1つの行を返す SQL SELECT 文でなければなりません。

詳細については、 コネクション切断の問題を乗り越える方法 を参照してください。

select 1
(MySQL の場合)

(または、dbconfig.xml で指定なし)

バリデーションクエリのタイムアウト

validation-query-timeout

検証クエリがデータベース接続の破損を検出するまでのシステム待ち時間 (単位は秒)。

検証クエリは処理量の小さいものを使用するためこの時間は非常に短い時間で構いません。

上記で Validation Query を指定した場合は Validation Query Timeout の値も指定する必要があります。指定しないと「-1」の値が設定されて、データベースの破損が発生していなくてもシステムは破損を無期限に待ち続けます。

これは MySQL にのみ行います。MySQL 以外のデータベースでバリデーション クエリ タイムアウトを使用すると、Jira インスタンスに重大な問題が発生します。

3
(MySQL の場合)

(または、dbconfig.xml で指定なし)

借りるときにテスト

pool-test-on-borrow

Jira がデータベース コネクション プールからデータベース コネクションを借りたときに、それが正しく機能するかどうかをテストします。

そのデータベース接続が破損している場合はプールから削除されます。

Jira はデータベース処理のたびに接続を流用するため、この値は常に「false」にする必要があります。

tip/resting Created with Sketch.

テータベース接続をうまく閉じれない問題が定常的に発生する場合は、このオプションを「true」にしてみてください。ただし、この方法は Time Between Eviction Runs の値を小さくしてもデータベース接続を閉じる際の問題の発生を防止も軽減もできない場合の最終手段としてください。

 

True (dbconfig.xml で指定されていない場合)。ただし、バリデーション クエリが明示的に指定されていない場合、この設定は有効になりませんMySQL は既定のバリデーション クエリを備えているため、この影響を受けます。

返却時にテスト

pool-test-on-return

Jira がデータベース コネクション プールにデータベース コネクションを返却したときに、それが正しく機能するかどうかをテストします。

そのデータベース接続が破損している場合はプールから削除されます。

Jira はデータベース処理のたびに流用した接続を返却するため、この値は常に「false」にする必要があります。

false
(dbconfig.xml で指定されていない場合)

アイドル状態にテスト

pool-test-while-idle

データベース接続がアイドル状態のときに正しく機能しているか否かを定期的にテストします。

そのデータベース接続が破損している場合はプールから削除されます。

MySQL の場合はこれを「true」に設定する必要があります。

初期設定では、MySQL データベース サーバーは、データベース接続が長期間使用されていなければデータベース接続を閉じます。Jira はアクティブに動作しない時間が長時間 (一晩など) に及ぶことが多いため、MySQL を利用している場合は問題が発生します。これを「true」にすることでこの動作を回避できます。

なお、Test While Idle の指定が必要となるのは、上で説明した Validation Query を指定したときのみです。

true
(MySQL の場合)

false
(dbconfig.xml で指定されていない場合)

追い出し実行間の時間

time-between-eviction-runs-millis

アイドルオブジェクトのエビクションスレッド実行間隔 (単位はミリ秒)。ゼロまたは負の値を指定するとアイドルオブジェクトのエビクションスレッドは実行されません。

エビクションスレッドは、アイドル状態にあるデータベース接続数が上で説明した Minimum Idle/Size を超えたときにアイドル状態にあるデータベース接続を削除します。

MySQL の場合、接続のエビクションとテストを正常に行うためにはこのパラメーターを大きめの正の値に設定します。一般的に妥当な値は300000 (5 分) です。

tip/resting Created with Sketch.

テータベース接続のクローズがうまくいかないという問題が定常的に発生する場合はこのオプション値を小さめにしてみてください。

 

300000
(MySQL の場合)

5000
(HSQLDB の場合)

(または、dbconfig.xml で指定なし)

追い出し可能な最小限のアイドル時間

min-evictable-idle-time-millis

アイドルオブジェクトのエビクションを実行する場合に、データベース接続プール内のオブジェクトがアイドルオブジェクトエビクションの対象となるまでのアイドル状態最小時間。


60000
(MySQL の場合)

4000
(HSQLDB の場合)

(または、dbconfig.xml で指定なし)

クローズ漏れの削除

pool-remove-abandoned

データベース接続のクローズ漏れ状態が次の Removed Abandoned Timeout で指定した時間を超えたときにそれを削除するか否かのフラグ。

内部エラーが発生した場合、Jira が借りたコネクションが返されないことがあります。これが頻繁に起こると、プール内のデータベース コネクションが不足し、Jira のパフォーマンス低下や完全な動作停止を引き起こす恐れがあります。

この値は「true」に設定する必要があります。

これによってプールで対象から漏れた接続を回復して、システム パフォーマンスの低下を防止します。

true

クローズ漏れの削除のタイムアウト

pool-remove-abandoned-timeout

データベース接続がクローズ漏れと判定されるまでのアイドル状態継続時間 (単位は秒)。


300

接続プールの監視

Jira ではデータベース接続の使用状況を [データベース監視] ページで確認できます。詳細は「データベース接続使用率の監視」をご参照ください。

最終更新日 2022 年 5 月 25 日

この内容はお役に立ちましたか?

はい
いいえ
この記事についてのフィードバックを送信する
Powered by Confluence and Scroll Viewport.