データベース接続切断の問題を乗り越える方法
データベース サーバーがリブートしたり、あるいはネットワーク障害が発生したりすると、データベースのコネクションプール内のすべてのコネクションが切断され ます。この問題を解決するには、通常 Confluence の再起動が必要になります。
しかし、単純な SQL クエリの実行によって、データベースのコネクションプール内のコネクションを有効にすることができます。プール内で切断されたデータベースコネクションが検出されると、新しいものが作成されてこれに置き替えられます。
これを行うため、データベース接続に任意の検証クエリを指定することができます。ダイレクト JDBC URL とデータソースのどちらを使用しているかに応じて、これは異なる設定になります。
データベース タイプに対する検証クエリ SQL の決定
各データベースの種類におけるバリデーションクエリは、それぞれ若干異なる SQL 構文の条件を有しています。バリデーションクエリは、プールからコネクションが回収される度に実行されるため、可能な限りシンプルなものが臨まれます。
各バリデーションクエリに推奨されるバリデーションクエリを以下に紹介します。:
データベースタイプ | バリデーションクエリ |
---|---|
MySQL |
|
Microsoft SQL Server |
|
Oracle |
|
PostgreSQL |
|
ダイレクト JDBC を使用する検証クエリの有効化
Confluence がデータベースのコネクションプール内のデータベースコネクションを確実に有効にするには:
- Confluence をシャットダウンします。
- Edit the
confluence.cfg.xml
file at the root of your Confluence Home and other important directories プロパティ「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> ...
confluence.cfg.xml
を保存します。- Confluence を再起動します。
データ ソースを使用する検証クエリの保証
Confluence がデータベースのコネクションプール内のデータベースコネクションを確実に有効にするには:
Confluence (もしくは Confluence を実行中の Tomcat インストレーション)をシャットダウンします。
- Edit the
conf/server.xml
file in your Confluence Install Directory, or in the Tomcat installation's CATALINA_HOME directory. データ ソースについての 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" /> ...
conf/server.xml
を保存します。- Confluence (もしくは Confluence を実行中の Tomcat インストレーション)を再起動します。
結果と考察
これで、データベースのコネクションプールにおける全てのコネクションが完全に失われても、Confluence 、あるいは Confluence を実行中のアプリケーションサーバを再起動させる事無くコネクションを回復できます。
パフォーマンス上の留意点:
このオプションを設定すると、パフォーマンスに影響が及びますが、クエリそのものは素早く実行されるため、パフォーマンス上の全体的な影響は最低 限に保たれます。更に、このクエリが実行されるのは、コネクションが成立した場合においてのみとなります。よって、リクエストの間ずっとコネクションが保 たれると、クエリは一回のリクエストに対して一度のみしか発生しません。
大きな Confluence インストレーションを実行している場合は、これがもたらすパフォーマンス上の影響を評価してから実装することをお勧めします。