コネクション切断の問題を乗り越える方法
データベース サーバーがリブートしたり、ネットワーク障害が発生したりすると、データベース コネクション プール内のすべてのコネクションが切断されます。この問題を解決するには通常、Jira の再起動が必要になります。
しかし、単純な SQL クエリの実行によって、データベースのコネクションプール内のコネクションを有効にすることができます。プール内で切断されたデータベースコネクションが検出されると、新しいものが作成されてこれに置き替えられます。
これを行うには、データベース接続プールにある接続を検証するクエリをコンテンツとするオプションの要素 <validation-query/>
(Jira ホーム ディレクトリの dbconfig.xml
ファイル内) を指定する必要があります。詳細は次の手順をご参照ください。
Jira でデータベース コネクションのバリデーションを確実に行う
- Jira (または Jira を実行中の Tomcat インストール) をシャットダウンします。
- Jira ホームディレクトリで
dbconfig.xml
ファイルを編集するか、 Jira 設定ツール の [詳細] タブを使用して、関連する設定を行います。 - お使いのデータベース向けのバリデーションクエリを設定します:
dbconfig.xml
ファイルを編集する場合は、データベースのタイプに適したバリデーション クエリを持つ<validation-query/>
要素を追加します (次の MySQL の例を参照)。詳細は以下「バリデーション クエリの決定」をご参照ください。<?xml version="1.0" encoding="UTF-8"?> <jira-database-config> <name>defaultDS</name> <delegator-name>default</delegator-name> <database-type>mysql</database-type> <jdbc-datasource> <url>jdbc:mysql://dbserver:3306/jiradb?useUnicode=true&characterEncoding=UTF8&sessionVariables=storage_engine=InnoDB</url> <driver-class>com.mysql.jdbc.Driver</driver-class> <username>jiradbuser</username> <password>password</password> <pool-min-size>20</pool-min-size> <pool-max-size>20</pool-max-size> <pool-max-wait>30000</pool-max-wait> <validation-query>select 1</validation-query> <min-evictable-idle-time-millis>60000</min-evictable-idle-time-millis> <time-between-eviction-runs-millis>300000</time-between-eviction-runs-millis> <pool-max-idle>20</pool-max-idle> <pool-remove-abandoned>true</pool-remove-abandoned> <pool-remove-abandoned-timeout>300</pool-remove-abandoned-timeout> <pool-test-while-idle>true</pool-test-while-idle> <pool-test-on-borrow>false</pool-test-on-borrow> <validation-query-timeout>3</validation-query-timeout> </jdbc-datasource> </jira-database-config>
- Jira 設定ツールをご利用の場合は、[詳細] タブで [バリデーション クエリ] チェックボックスを選択して、データベースのタイプに適したバリデーション クエリを入力します。詳細は「バリデーション クエリの決定」をご確認ください。
- バリデーションクエリのタイムアウトを指定します。この値は、データベースコネクションが切断されたものとシステムが判断するまで、システムが待機しなくてはならない適当な時間 (秒単位) となります:
dbconfig.xml
ファイルを編集する場合は、<validation-query-timeout/>
要素を適切な時間の長さ (秒単位) で追加します。これは MySQL のみで行う必要があります。
- Jira 設定ツールを利用する場合、[詳細] タブから [バリデーション クエリ タイムアウト] チェックボックスを選択し、適切な時間の長さ (秒単位) を入力します。
上記のバリデーション クエリのオプションに関連する、以下のオプションを指定することもできます(詳細については、 データベース接続のチューニング - コネクション プールの設定 を参照して下さい)。
JIRA 設定ツール 「詳細」 タブ オプション
dbconfig.xml
の要素アイドル状態にテスト pool-test-while-idle
追い出し実行間の時間 time-between-eviction-runs-millis
追い出し可能な最小限のアイドル時間 min-evictable-idle-time-millis
編集した
dbconfig.xml
ファイルを保存します (Jira 設定ツールを使用している場合は [保存] ボタンをクリックします)。- Jira (または Jira を実行している Tomcat) を再起動します。
接続が閉じる問題が引き続き発生する場合は、time-between-eviction-runs-millis
パラメーターを低い値に設定、または最終手段として test-on-borrow
を true
に設定する必要が生じる可能性があります。test-on-borrow
の詳細については「データベース接続のチューニング - 接続プールの設定」セクションをご参照ください。
バリデーション クエリおよびタイムアウトの決定
各データベースの種類におけるバリデーションクエリは、それぞれ若干異なる SQL 構文の条件を有しています。バリデーションクエリは、プールからコネクションが回収される度に実行されるため、可能な限りシンプルなものが臨まれます。バ リデーションクエリのタイムアウトは、MySQL 向けにおいてのみ設定します。
各バリデーションクエリに推奨されるバリデーションクエリを以下に紹介します。:
データベース タイプ | バリデーション クエリ | バリデーション クエリ タイムアウト |
---|---|---|
MySQL |
| 3 |
Microsoft SQL Server |
| N/A |
Oracle |
| N/A |
PostgreSQL |
| N/A |
バリデーション クエリ タイムアウトを MySQL 以外のデータベースで使用すると、重大な問題が Jira インスタンスに発生します。
結果
これで、データベースのコネクション プールにおける全てのコネクションが完全に失われても、Jira、あるいは Jira を実行中のアプリケーション サーバを再起動させることなくコネクションを回復できます。
パフォーマンス上の留意点
- このオプションを設定すると、パフォーマンスに影響が及びますが、クエリそのものは素早く実行されるため、パフォーマンス上の全体的な影響は最低 限に保たれます。更に、このクエリが実行されるのは、コネクションが成立した場合においてのみとなります。よって、リクエストの間ずっとコネクションが保 たれると、クエリは一回のリクエストに対して一度のみしか発生しません。
- 大規模な Jira インストールを実行している場合、この操作によるパフォーマンスへの影響を評価してから実装することをおすすめします。