コネクション切断の問題を乗り越える方法

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

このページの内容

お困りですか?

アトラシアン コミュニティをご利用ください。

コミュニティに質問

データベース サーバーがリブートしたり、あるいはネットワーク障害が発生したりすると、データベース コネクション プール内のすべてのコネクションが切断されます。この問題を解決するには、通常 JIRA の再起動が必要になります。

しかし、単純な SQL クエリの実行によって、データベースのコネクションプール内のコネクションを有効にすることができます。プール内で切断されたデータベースコネクションが検出されると、新しいものが作成されてこれに置き替えられます。

To do this, you need to specify an optional <validation-query/> element (in the dbconfig.xml file of your JIRA home directory), whose content is the query which validates connections in the database connection pool. See the following procedure for details.

JIRA がデータベースコネクションを確実に有効にする方法

  1. JIRA をシャットダウンします(もしくは JIRA を実行中の Tomcat インストレーション)
  2. Edit the dbconfig.xml file at the root of your JIRA home directory or use the Advanced tab of the JIRA configuration tool to configure the relevant settings.
  3. お使いのデータベース向けのバリデーションクエリを設定します:
    • dbconfig.xml ファイルを編集する際は、以下の MySQL 用の例にあるように、使用するタイプのデータベースに適したバリデーション クエリを持つ <validation-query/> 要素を追加します (詳細については、以下の バリデーション クエリの決定 を参照してください)。

      <?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&amp;characterEncoding=UTF8&amp;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 設定ツールを利用している場合は、詳細 タブからバリデーション クエリ のチェックボックスを選択して、使用するデータベースのタイプに適したバリデーション クエリを入力します。(詳細については、以下の バリデーション クエリの決定 を参照してください。)
  4. バリデーションクエリのタイムアウトを指定します。この値は、データベースコネクションが切断されたものとシステムが判断するまで、システムが待機しなくてはならない適当な時間 (秒単位) となります:
    • dbconfig.xml ファイルを編集する際は、<validation-query-timeout/> 要素を適切な時間の長さ(秒単位)で追加します。(warning) これは、MySQL でのみ行います。
    • JIRA 設定ツール を使用する場合は、詳細 タブから、バリデーション クエリ タイムアウト のチェックボックスを選択し、適切な長さの時間(秒単位)を入力します
  5. 上記のバリデーション クエリのオプションに関連する、以下のオプションを指定することもできます(詳細については、 データベース接続のチューニング - コネクション プールの設定  を参照して下さい)。

    JIRA 設定ツール 「詳細」 タブ オプション

    dbconfig.xml の要素

    アイドル状態にテスト pool-test-while-idle
    追い出し実行間の時間 time-between-eviction-runs-millis
    追い出し可能な最小限のアイドル時間 min-evictable-idle-time-millis
  6. Save your edited dbconfig.xml file (or click the Save button if using the JIRA configuration tool).

  7. JIRA (もしくは、JIRA を実行している Tomcat) を再起動します。

(info) 注意: コネクションの切断に関する問題が引き続き発生する場合、time-between-eviction-runs-millis パラメーターを低い値に設定するか、test-on-borrowtrue に設定する必要がある場合があります。test-on-borrow の詳細については、「データベース接続のチューニング - コネクション プールの設定」セクションを参照してください。

バリデーション クエリおよびタイムアウトの決定

各データベースの種類におけるバリデーションクエリは、それぞれ若干異なる SQL 構文の条件を有しています。バリデーションクエリは、プールからコネクションが回収される度に実行されるため、可能な限りシンプルなものが臨まれます。バ リデーションクエリのタイムアウトは、MySQL 向けにおいてのみ設定します。

各バリデーションクエリに推奨されるバリデーションクエリを以下に紹介します。:

データベース タイプ

バリデーション クエリ

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

MySQL

select 1

3

Microsoft SQL Server

select 1

N/A

Oracle

select 1 from dual

N/A 

PostgreSQL

select version();

N/A

(warning) バリデーション クエリ タイムアウト を MySQL 以外のデータベースで使用すると、JIRA インスタンスに重大な問題が生じます。

結果

これで、データベースのコネクションプールにおける全てのコネクションが完全に失われても、JIRA 、あるいは JIRA を実行中のアプリケーションサーバを再起動させる事無くコネクションを回復できます。

(warning) パフォーマンス上の留意点

  • このオプションを設定すると、パフォーマンスに影響が及びますが、クエリそのものは素早く実行されるため、パフォーマンス上の全体的な影響は最低 限に保たれます。更に、このクエリが実行されるのは、コネクションが成立した場合においてのみとなります。よって、リクエストの間ずっとコネクションが保 たれると、クエリは一回のリクエストに対して一度のみしか発生しません。
  • 大きな JIRA インストレーションを実行している場合は、これがもたらすパフォーマンス上の影響を評価してから実装した方がよいかもしれません。
最終更新日 2018 年 5 月 8 日

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

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