7. JDBCデータソース

JDBCデータソースのチューニングについて説明します。ここでは、主に、コネクションプール数に関するチューニングポイントについて説明しています。

以降の説明で、「設定方法」には、設定対象となる統合運用管理ツール上の項目名や、MOの属性名を記述しています。設定方法の詳細については、 [ リファレンス > 設定 > JDBCデータソース > JDBCデータソース設定項目・設定方法 ] を参照してください。

7.1. コネクションプール数の設定

コネクションプール数の設定について説明します。

7.1.1. 最小プールサイズの設定

アプリケーションの性能に大きな影響があるため、最小プールサイズを適切にチューニングすることが重要です。

最小プールサイズ[minPoolSize]にはデフォルトで4が設定されています。最小プールサイズに、アプリケーションの動作スレッド数と同じ値を設定すると、最も高い性能を得ることができますが、 反面、多くのコネクションやメモリなどの資源が必要となります。このため、一般的には、データベースサーバ側の接続数の制限に合わせてコネクションプール数のチューニングを行います。

最小プールサイズには、システム内で使用される全コネクション数がデータベースサーバ側の接続数の制限を越えない範囲で、アプリケーションの動作スレッド数か、それより小さい値を設定してください。 コネクションプールは、アプリケーションプロセス毎に、JDBCデータソースの定義数分存在します。それらのコネクションプールの最小プール数を合計し、運用管理操作で必要となるコネクション数などを考慮した上で、 最小プールサイズ、または、データベースサーバ側の接続数の制限値を調整してください。

最小プールサイズを超えて払い出されたコネクションは、アプリケーションが使い終わった後で破棄されます。その際、アプリケーションが使い終わった直後にコネクションが破棄されると、負荷が高い場合に、 コネクションの接続および切断を繰り返すことで性能が極端に低下することが懸念されます。そのための対策として、コネクション解放の待ち合わせ時間[shrinkDelayTime]のデフォルト値が15秒に設定されています。 それでもなお、度々コネクションの接続および切断が繰り返される状況になる場合は、コネクション解放の待ち合わせ時間を長くすることで性能を改善できます。

7.1.1.1. 確認方法

アプリケーションの動作スレッド数は、最小プールサイズに設定する最大値です。その値と、負荷をかけた際の次の統計情報(使用中コネクションの最大数)の値を照らし合わせて、 最終的に最小プールサイズに設定すべき値を決定してください。

統合運用管理ツールで確認する場合:

エージェントプロセスで動作する場合

 [WebOTX管理ドメイン[<ホスト名>]]-[<ドメイン名>]-[統計情報]-[<ドメイン名>]-[アプリケーションサーバ]-[リソース]-[jdbc-datasource.JDBCデータソース名]-[プール中のコネクション数]-[NumConnUsed]-[使用中コネクション数の最大値]

Standard/Enterprise のプロセスグループで動作する場合

[WebOTX管理ドメイン[<ホスト名>]]-[<ドメイン名>]-[統計情報]-[<ドメイン名>]-[TPシステム]-[アプリケーショングループ]-[アプリケーショングループ名]-[プロセスグループ]-[プロセスグループ名]-[process]-[プロセスID]-[リソース]-[jdbc-datasource.JDBCデータソース名]-[プール中のコネクション数]-[NumConnUsed]-[使用中コネクション数の最大値]

運用管理コマンドで確認する場合:

エージェントプロセスで動作する場合

otxadmin> get --monitor *.*.jdbc-datasource*.NumConnUsed-HighWaterMark

Standard/Enterprise のプロセスグループで動作する場合

otxadmin> get --monitor tpsystem.*.*.*.*.*.*.jdbc-datasource*.NumConnUsed-HighWaterMark

統計情報は、JDBCデータソースの統計情報の採取レベルをLOWに設定した上で、JDBCデータソースから最初にコネクション取得を行った際に表示されます。採取レベルの変更方法は次のとおりです。

統合運用管理ツールで設定する場合:

次の属性の値を変更し、更新ボタンを押してください。
[WebOTX管理ドメイン[<ホスト名>]]-[<ドメイン名>]-[アプリケーションサーバ]-[モニタリングサービス]-[モジュールモニタリングレベル]-[jdbc datasourceモニタリングレベル]

運用管理コマンドで設定する場合:

otxadmin> set server.monitoring-service.module-monitoring-levels.jdbc-datasource=LOW
7.1.1.2. 設定方法

統合運用管理ツールで設定する場合:

次の属性の値を変更し、更新ボタンを押してください。
[WebOTX管理ドメイン[<ホスト名>]]-[<ドメイン名>]-[リソース]-[jdbcデータソース]-[JDBCデータソース名]-[コネクションプール]-[最小プールサイズ]

[WebOTX管理ドメイン[<ホスト名>]]-[<ドメイン名>]-[リソース]-[jdbcデータソース]-[JDBCデータソース名]-[コネクションプール]-[コネクション解放までの待ち時間]

運用管理コマンドで設定する場合:

otxadmin> set server.resources.jdbc-datasource.<JDBCデータソース名>.minPoolSize=10
otxadmin> set server.resources.jdbc-datasource.<JDBCデータソース名>.shrinkDelayTime=60

7.1.2. 初期プールサイズの設定

初期プールサイズ[initialPoolSize]に0が設定されている場合、アプリケーションがコネクションを取得する際に、必要に応じて接続されます。このため、業務の運用開始直後は、コネクションの接続を行う分、業務の性能が悪くなります。

EJBアプリケーションやWebアプリケーションでは、初期プールサイズで指定された数のコネクションが、アプリケーションプロセス起動時に予め接続されていますので、業務の運用開始直後の性能劣化を防ぐことができます。

初期プールサイズには、最小プールサイズで指定された数以下の値を指定してください。

7.1.2.1. 設定方法

統合運用管理ツールで設定する場合:

次の属性の値を変更し、更新ボタンを押してください。
[WebOTX管理ドメイン[<ホスト名>]]-[<ドメイン名>]-[リソース]-[jdbcデータソース]-[JDBCデータソース名]-[コネクションプール]-[初期プールサイズ]

運用管理コマンドで設定する場合:

otxadmin> set server.resources.jdbc-datasource.<JDBCデータソース名>.initialPoolSize=4

7.1.3. 最大プールサイズの設定

特定のアプリケーションプロセスで、極端に多くのコネクションを取得してしまうと、他のアプリケーションプロセスでデータベースに 接続できなくなってしまう恐れがあります。このような状況を防止するための対策としては、最大プールサイズの設定が有効です。
最大プールサイズ[maxPoolSize]には、最小プールサイズよりも大きく、データベースサーバ側の最大接続数よりも小さい値を設定してください。
また、データベースサーバの状態監視オプション[checkServerOption]に「定期的にデータベースサーバの状態を確認[monitor]」を指定し、 データベースサーバの監視コマンド[checkServerCommand]にconnect以外を指定する場合は、アプリケーションで使用するJDBCコネ クション数にデータベースサーバを監視するための接続(1本)を加えた値を設定してください。

7.1.3.1. 設定方法

統合運用管理ツールで設定する場合:

次の属性の値を変更し、更新ボタンを押してください。
[WebOTX管理ドメイン[<ホスト名>]]-[<ドメイン名>]-[リソース]-[jdbcデータソース]-[JDBCデータソース名]-[コネクションプール]-[最大プールサイズ]

運用管理コマンドで設定する場合:

otxadmin> set server.resources.jdbc-datasource.<JDBCデータソース名>.maxPoolSize=10

7.2. その他の設定

その他の設定について説明します。

7.2.1. ステートメントの最大プール数の設定

JDBCドライバでステートメントプール機能をサポートしている場合、その機能を利用することで、ステートメントの生成コスト分の性能を改善することができます。

JDBCデータソースがサポートするJDBCドライバの中では、OracleとSequeLinkのJDBCドライバで、ステートメントプール機能をサポートしています。

ステートメントプール機能では、文字列化されたSQL命令をキーにしてステートメントの検索が行われます。このため、文字列化されたSQL命令に、可変の値が含まれないjava.sql.preparedStatementを利用し、 検索効率を高めることが重要です。

7.2.1.1. 設定方法

統合運用管理ツールで設定する場合:

次の属性の値を変更し、反映ボタンを押してください。
[WebOTX管理ドメイン[<ホスト名>]]-[<ドメイン名>]-[リソース]-[jdbcデータソース]-[JDBCデータソース名]-[コネクションプール]-[ステートメントの最大プール数]

運用管理コマンドで設定する場合:

otxadmin> set server.resources.jdbc-datasource.<JDBCデータソース名>.maxStatements=20

7.2.2. テンプレートによるカスタマイズの設定

JDBCデータソースの登録および更新時に、カスタマイズテンプレート[customizeTemplate]を選択することで性能や信頼性に関わる複数の属性を一括で推奨値にできます。次のテンプレートを選択可能です。

表2.7.2.2-1
テンプレート 説 明
性能重視でカスタマイズ
(Performance)
性能を向上させるためにデータソースをカスタマイズします。
信頼性重視でカスタマイズ
(Reliability)
信頼性を向上させるためにデータソースをカスタマイズします。
性能と信頼性重視でカスタマイズ
(PerformanceAndReliability)
性能と信頼性を向上させるためにデータソースをカスタマイズします。
カスタマイズなし
(none)
性能と信頼性観点でのカスタマイズを行いません。

JDBCデータソースの性能向上や信頼性に関する属性のデフォルトカスタマイズ値は以下の表に示します。

JDBCデータソースの性能向上や信頼性に関する属性のデフォルトカスタマイズ値
属性名 カスタマイズ値 設定値の根拠 性能向上/信頼性
maxPoolSize 20 スレッド数のデフォルト値です。 性能向上
minPoolSize 20 スレッド数のデフォルト値です。
initialPoolSize 5 プロセスグループのスレッド数のデフォルト値(1〜3)に近い値で、初期接続による性能改善効果が得られる値です。
shrinkDelayTime 60 デフォルト値の15秒を大きく上回り、性能改善効果が高い時間です。(単位:秒)
waitFreeConnTimeout 20 高負荷時に誤動作しにくく、リトライを行ってもCORBAのリクエストタイムアウトが発生しにくい間隔です。(単位:秒)
maxStatements 20 性能改善効果があり、カーソル数の最大数超過となりにくい値です。
connectRetryMax 1 計画停止等でエラーを復旧できる回数です。 信頼性
connectRetryInterval 10 1回リトライを行ってもCORBAのリクエストタイムアウトが発生しにくい間隔です。(単位:秒)
checkServerOption monitor 負荷に影響が少ない方のオプションです。
checkServerInterval 60 負荷をなるべく抑えつつ、デフォルト値の180秒より短時間に障害を検出できる間隔です。(単位:秒)
checkServerCommand connect 障害検出までの時間が短いコマンドです。
queryTimeout 300 トランザクションのタイムアウト時間のデフォルト値の範囲内で十分長い時間です。(単位:秒)
readTimeout 315 queryTimeoutプラスアルファの時間です。(単位:秒)
loginTimeout 15 1回リトライを行ってもCORBAのリクエストタイムアウトが発生しにくい間隔です。(単位:秒)

テンプレートの内容は、次のファイルに格納されています。これらの内容を修正することによって、カスタマイズすることができます。

表2.7.2.2-3
テンプレート テンプレートファイル名
性能重視でカスタマイズ
(Performance)
createJdbcDataSourceGUI;in_customizeTemplate;Performance.xml
信頼性重視でカスタマイズ
(Reliability)
createJdbcDataSourceGUI;in_customizeTemplate;Reliability.xml
性能と信頼性重視でカスタマイズ
(PerformanceAndReliability)
createJdbcDataSourceGUI;in_customizeTemplate;PerformanceAndReliability.xml

格納ディレクトリ:
            ${INSTALL_ROOT}/lib/dynamic-change/
            ${INSTANCE_ROOT}/config/dynamic-change/

7.2.2.1. 設定方法

統合運用管理ツールで設定する場合:

次の属性の値を変更します。カスタマイズの更新後に再表示の操作を行ってください。
[WebOTX管理ドメイン[<ホスト名>]]-[<ドメイン名>]-[リソース]-[jdbcデータソース]-[JDBCデータソース名]-[カスタマイズ]-[カスタマイズテンプレート]

運用管理コマンドで設定する場合:

otxadmin> set server.resources.jdbc-datasource.<JDBCデータソース名>.customizeTemplate=Performance

7.2.3. トランザクションで使用する物理コネクション数に関する設定

JTAのトランザクション制御を行う場合、JTAのトランザクション毎に1つの物理コネクションを使用するかどうか[useOneConnectionPerTransaction] にtrueを設定することで、一部のトランザクション制御のシーケンスが省略され、性能が改善される可能性があります。

データソース種別[dataSourceType]がDB2のOptional Package API[JDBCEX_DB2]やPostgreSQLのOptional Package API[JDBCEX_PostgreSQL]、JDBC API[JDBC]の場合、 JTAのトランザクション毎に1つの物理コネクションを使用するかどうか[useOneConnectionPerTransaction]の設定に関わらずtrueの場合の動作になります。 それ以外の場合で、JTAのトランザクション内で、同一データベースに対する複数のJDBCコネクションを同時に利用する場合に性能が改善します。また、EJBから 別のEJBを呼び出す場合の性能が改善されることがあります。

プログラミング方法の制約等については、 マニュアル [ アプリケーション開発 > その他のアプリケーション > JDBCアプリケーションの開発 > プログラミング・開発ガイド > JTAのトランザクションで、同時に複数のJDBCコネクションを利用する方法 ] を参照してください。

7.2.3.1. 設定方法

統合運用管理ツールで設定する場合:

次の属性の値を変更し、反映ボタンを押してください。
[WebOTX管理ドメイン[<ホスト名>]]-[<ドメイン名>]-[リソース]-[jdbcデータソース]-[JDBCデータソース名]-[拡張]-[JTAのトランザクション毎に1つの物理コネクションを使用するかどうか]

運用管理コマンドで設定する場合:

otxadmin> set server.resources.jdbc-datasource.<JDBCデータソース名>.useOneConnectionPerTransaction=true