データベース接続切断の問題を乗り越える方法

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

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

これを行うため、データベース接続に任意の検証クエリを指定することができます。ダイレクト JDBC URL とデータソースのどちらを使用しているかに応じて、これは異なる設定になります。

データベース タイプに対する検証クエリ SQL の決定

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

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

データベースタイプ

バリデーションクエリ

MySQL

select 1

Microsoft SQL Server

select 1

Oracle

select 1 from dual

PostgreSQL

select 1

ダイレクト JDBC を使用する検証クエリの有効化

Confluence がデータベースのコネクションプール内のデータベースコネクションを確実に有効にするには:

  1. Confluence をシャットダウンします。
  2. Edit the confluence.cfg.xml file at the root of your Confluence Home and other important directories
  3. プロパティ「hibernate.c3p0」を追加して「true」を設定し、プロパティ「hibernate.c3p0.preferredTestQuery」を追加して上記で決定したデータベース タイプ用のクエリの値を設定します。詳細については、追加された2つのプロパティを持つファイルの以下の抜粋を参照してください。 

    confluence.cfg.xml (抜粋)
        ...
        <property name="hibernate.c3p0.acquire_increment">1</property>
        <property name="hibernate.c3p0.idle_test_period">100</property>
        <property name="hibernate.c3p0.max_size">30</property>
        <property name="hibernate.c3p0.max_statements">0</property>
        <property name="hibernate.c3p0.min_size">0</property>
        <property name="hibernate.c3p0.timeout">30</property>
        <property name="hibernate.c3p0.validate">true</property>
        <property name="hibernate.c3p0.preferredTestQuery">select 1</property>
        ...
  4. confluence.cfg.xml を保存します。
  5. Confluence を再起動します。

データ ソースを使用する検証クエリの保証

Confluence がデータベースのコネクションプール内のデータベースコネクションを確実に有効にするには:

  1. Confluence (もしくは Confluence を実行中の Tomcat インストレーション)をシャットダウンします。

  2. Edit the conf/server.xml file in your Confluence Install Directory, or in the Tomcat installation's CATALINA_HOME directory.
  3. データ ソースについての Resource 要素を見つけ、「validationQuery」要素を追加し、上記で決定したデータベース タイプのクエリの値を指定します。詳細については、この追加されたファイルの以下の抜粋を参照してください。

    server.xml (抜粋)
    ... 
    <Resource name="jdbc/confluence" auth="Container" type="javax.sql.DataSource"
              username="postgres"
              password="postgres"
              driverClassName="org.postgresql.Driver"
              url="jdbc:postgresql://localhost:5432/yourDatabaseName"
              maxTotal="25"
              maxIdle="10"
              validationQuery="select 1" />
    ...
  4. conf/server.xml を保存します。

  5. Confluence (もしくは Confluence を実行中の Tomcat インストレーション)を再起動します。

結果と考察

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

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

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

  • 大きな Confluence インストレーションを実行している場合は、これがもたらすパフォーマンス上の影響を評価してから実装することをお勧めします。

最終更新日: 2015 年 12 月 2 日

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

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