Interstage Application Server チューニングガイド
目次 索引 前ページ次ページ

第3章 J2EEのチューニング

3.1 IJServerのチューニング

 IJServerをチューニングする時に考慮するポイントは以下です。ここに記述されたチューニングは、ServletコンテナとEJBコンテナの両方に有効です。

■プロセス多重度

 1つのIJServerを、複数のプロセスで起動できます。これにより、負荷を分散できます。
 IJServerのプロセス多重度は、Interstage管理コンソールのワークユニット設定で指定できます。詳細については、Interstage管理コンソールのヘルプを参照してください。

Java VMのヒープ領域サイズ

 Interstage管理コンソールを使用して、ワークユニット設定のJava VMオプションを指定することで、IJServerが動作するJava VMのパラメタを変更して動作させることができます。
 パラメタを変更して、Java VMヒープ領域サイズなどを変更できます。

 JDK 1.3の場合における最大ヒープ領域サイズの例を次に示します。
 最大ヒープ領域のサイズの省略値は、Java VMによって異なりますので、JDKのドキュメントを参照してください。java.lang.OutOfMemoryErrorが多発する場合には、本定義項目で、Java VMの最大ヒープ領域を増加させてください。


 Java VMの最大ヒープ領域を512メガバイトとする場合の設定

-Xmx512m

 なお、Interstageではヒープ領域の問題を警告メッセージで通知する、予兆監視機能を提供しています。
 警告メッセージが出力された場合、そのまま業務を継続すると、メモリ不足やレスポンス低下などの問題が発生する可能性があります。これらの問題を解決するために、警告メッセージに記載されている不足リソースの情報を元に、チューニングを実施してください。
 JavaVMで問題となる異常の原因は、ヒープ領域またはPerm領域の不足です。これを回避するために、現在の上限値を20%増加させて運用を再開します。それでも警告が出力される場合は、上限値を更に20%増加させて、警告が出力されなくなるまで繰り返しチューニングを実施してください。チューニングを繰り返し行い、警告メッセージが出力されない状態にすることで、安定稼動するシステムを構築することができます。
 予兆監視機能については、“Interstage運用ガイド”を参照してください。

ガベージコレクション発生回数

 IJServerでは、JavaのRMI機能による自動ガベージコレクションがデフォルトで1分間隔で動作します。
 RMI機能による自動ガベージコレクションの発生間隔は、Interstage管理コンソール > “ワークユニット名” > [環境設定]タブ > [ワークユニット設定]のJava VMオプションに、“-Dsun.rmi.dgc.client.gcInterval=発生間隔”および“-Dsun.rmi.dgc.server.gcInterval=発生間隔”を指定してチューニングします。発生間隔には、マイクロ秒単位で数値を指定してください。


RMI機能による自動ガベージコレクションの発生間隔を、3600000マイクロ秒(1時間)に変更する場合

-Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000

 なお、RMI機能による自動ガベージコレクションの発生間隔をチューニングしても、ガベージコレクション発生回数が削減されない場合、Java VMのヒープ領域サイズが不足している可能性がありますので、Java VMのヒープ領域サイズのチューニングを行うことで削減される場合があります。“Java VMのヒープ領域サイズ”を参照ください。

■トランザクションアイソレーションレベル

 EJBアプリケーションからデータベースにアクセスする場合、EJBアプリケーションの実行多重度を上げるには、トランザクションアイソレーションレベル(以降、アイソレーションレベルと呼びます)を考慮する必要があります。アイソレーションレベルとは、データベースに対する排他整合性水準のことです。

 使用できるアイソレーションレベルを以下に示します。アイソレーションレベルの詳細は、使用するデータベースのマニュアルを参照してください。

 アイソレーションレベルの設定は、UserTransaction.begin()メソッドを発行してから、UserTransaction.commit()メソッドまたはUserTransaction.rollback()メソッドを発行するまでの間有効です。

◆設定方法

 アイソレーションレベルは、Interstage管理コンソールで設定します。設定方法の詳細については、Interstage管理コンソールのヘルプを参照してください。


【DBMSにOracleを使用している場合】

 「ORA-8177:このトランザクションのアクセスを逐次化できません。」というエラーは、トランザクションアイソレーションレベルにTransaction-serializableが設定されているにもかかわらず、複数のユーザが同時に同一の表を更新した場合など、トランザクションのシリアル化を保障できない場合に出力され、ユーザにその旨を伝えています。

 トランザクションアイソレーションレベルにTransaction-serializableを設定し、エラー「ORA-8177」が発生した場合は、アプリケーション側で単に「異常終了」と判断するのではなく、トランザクションのロールバック後に「リトライ」させるなどの対処が必要になります。
 なお、トランザクションアイソレーションレベルがTransaction-read-committed(Oracleのデフォルト)の場合は、「ORA-8177」エラーが発生することはありません。特にTransaction-serializableの設定が必須ではない場合、Transaction-read-committedを設定することにより、同時実行性が向上し、「ORA-8177」エラーも発生しなくなります。

■JDBCのコネクション

 ここでは、JDBCのコネクションの以下について説明します。

 InterstageのJNDIサービスプロバイダから取得したJDBCデータソースを使用した場合、JDBCのコネクションはプーリングされて再利用されます。

コネクションプーリングの種別

 コネクションプーリングには、以下の2種類があります。

 それぞれの特徴は、以下のとおりです。

Interstageでコネクションプーリングする
Interstageでコネクションのプーリング制御を行うため、Interstage管理コンソールでコネクションプーリングの詳細設定ができます。プーリングされている情報を、Interstage管理コンソールのモニタ機能で参照できます。
JDBCドライバでコネクションプーリングする
JDBCドライバでコネクションのプーリング制御を行うため、使用する各JDBCドライバの機能を使用して、コネクションプーリングの設定を行います。設定方法の詳細は、JDBCドライバのマニュアルを参照してください。
JDBCドライバ側でプーリング制御を行うため、Interstage管理コンソールで参照可能なJDBCデータソースのモニタ情報は、「アプリケーションからのコネクション確立情報」のみです。詳細はInterstage管理コンソールのヘルプを参照してください。

 コネクションプーリングの機能概要については、“J2EEユーザーズガイド”の“JDBC(データベース)のコネクション”を参照してください。

 チューニング方法について説明します。

 以下に各データベースとコネクションプーリングの対応について記載します。

DB種別

コネクションプーリング

Oracle

Interstageでコネクションプーリングを行います。 (注1)

Symfoware

JDBCドライバでコネクションプーリングを行います。


SQL Server

JDBCドライバがコネクションプーリングを行います。


PostgreSQL

データソースの種類に“Interstageでコネクションプーリングを行う”を選択している場合に、Interstageでコネクションプーリングを行います。
“PostgreSQLでコネクションプーリングを行う”の場合はJDBCドライバがコネクションプーリングを行います。

注1) “Oracleでコネクションプーリングを行う”を設定した旧バージョンの環境をバックアップ、リストアした場合、OracleのJDBCドライバがプーリングを行います。

 Interstage管理コンソールで参照可能なJDBCデータソースのモニタ情報のうち、「アプリケーションからのコネクション確立情報」以外はInterstageでコネクションプーリングを行う場合のみ出力されます。
 詳細は、Interstage管理コンソールのヘルプを参照してください。

 また、プーリングされているJDBCのコネクションを使用する場合、データソース単位にオプションを設定することで、まずそれが使用可能であるかを判定し、使用できないコネクションである場合には、自動的にDBMSに再接続することが可能です。
 自動的に再接続することによって、DBMSが回線異常等でダウンした場合にも、IJServerを再起動することなく、アプリケーションを運用することができます。

コネクションプーリングのチューニングパラメタ

 以下に、Interstage管理コンソールを使用して設定可能なパラメタを示します。

パラメタ

説明

設定値

事前コネクション数 (注1)

運用で必要なコネクションを、起動時にあらかじめ取得することにより、初回疎通時から2回目以降と同等の処理速度が得られます。

最大値:2147483647
最小値:0
初期設定値:0

最大コネクション数 (注2)

最大コネクション数を抑止することにより、メモリ資源を抑止することが可能です。
最大コネクション数すべてをJ2EEアプリケーションが使用している状態で接続要求があった場合、コンテナは“コネクションタイムアウト”における設定時間の期間内で、インスタンスプールにコネクションが返却されるのを待ちます。インスタンスプールにコネクションが返却された場合にはそのコネクションを使用し、返却されなかった場合にはSQLExceptionを返却します。

最大値:2147483647
最小値:1
初期設定値:64

コネクションタイムアウト

最大コネクション数分のコネクションすべてがJ2EEアプリケーションで使用中の状態で、コネクションの接続要求が来た場合に、インスタンスプールにコネクションが返却されるのを待つ時間を指定します。
時間が超過してもコネクションが返却されなかった場合は、SQLExceptionが返却されます。0を指定した場合は、タイムアウト監視を行いません。

最大値:2147483647
最小値:0
初期設定値:5
(単位:秒)

アイドルタイムアウト (注2)

使用されていないコネクションをタイムアウトで破棄することにより、無駄なメモリ資源を解放することができます。
ただし、事前コネクトで接続されたコネクションはアイドルタイムアウトの対象となりません。

最大値:2147483647
最小値:0
初期設定値:600
(単位:秒)

異常時の再接続 (注2)

JDBCコネクションの自動再接続機能(注3)を使用するかどうかを指定します。
自動再接続機能を使用する場合、プーリングされているJDBCのコネクションが使用可能なコネクションであるかを判定し、使用できないコネクションの場合には自動的にDBMSに再接続します。

  • する
  • しない(デフォルト)

インターバル時間 (注2)

JDBCコネクションの自動再接続機能(注3)において、プーリングされているJDBCのコネクションが使用できない場合、またはDBMSへの接続に失敗した場合、再度接続を行うまでのインターバル時間を指定します。
異常時の再接続を[する]にした場合のみ、指定した値が有効になります。

最大値:2147483647
最小値:1
初期設定値:10
(単位:秒)

リトライ回数 (注2)

JDBCコネクションの自動再接続機能(注3)において、プーリングされているJDBCのコネクションが使用できない場合、またはDBMSへの接続に失敗した場合、再度接続を試みる回数を指定します。
異常時の再接続を[する]にした場合のみ、指定した値が有効になります。

最大値:2147483647
最小値:1
初期設定値:10
(単位:回数)

 注1)
 CMP2.0のEJBアプリケーションを配備したIJServerを起動する場合、起動時にDBMSの識別子長の最大値をチェックします。このため、事前コネクト機能を使用しない場合にも1コネクションだけDBMSへ接続します。
 Interstageでコネクションをプーリングする場合には、起動処理完了後にコネクションが切断されます。
 注2)
 最大コネクション数、アイドルコネクション、コネクションタイムアウトは、Oracle、またはPostgreSQL(Linuxシステムのみ)のデータソースを使用する場合に有効です。
 以下に、それぞれのデータソースを使用した場合の条件を示します。

.bindingsファイル

Oracle

PostgreSQL 

作成する場合

データソースの種類を、以下のどちらかから選択する。

  • Interstageでコネクションプーリングを行う
  • 分散トランザクションを使用する

データソースの種類を、以下を選択する。

  • Interstageでコネクションプーリングを行う

作成しない場合

OracleConnectionPoolDataSourceまたはOracleXADataSourceが、File SystemService Provider(※)に登録されている。

org.postgresql.jdbc2.optional.ConnectionPool(JDBC2.0の場合)またはorg.postgresql.jdbc3.Jdbc3ConnectionPool(JDBC3.0の場合)が、File SystemService Provider(※)に登録されている。

(※) File System Service Providerは、米国Sun Microsystems.Inc.が提供するJNDIのサービスプロバイダです。Oracleの場合、File System Service Providerを使用してデータソースを管理します。
 注3)
 JDBCコネクションの自動再接続機能は、DBMSの種別がOracle、またはPostgreSQL(Linuxシステムのみ)のデータソースを使用する場合に有効です。
 以下に、それぞれのデータソースを使用した場合の条件を示します。

項目

Oracle

PostgreSQL 

接続方法

JDBC2.X(データソース接続)
Interstageがコネクションをプーリングする。
(OracleConnectionPoolDataSourceを使用する。)

JDBC2.0またはJDBC3.0
Interstageがコネクションをプーリングする。

トランザクション種別

分散トランザクション機能を使用しない。

分散トランザクション機能を使用しない。


なお、Symfowareの場合は、Connection Managerの機能を使用することで、データベースサーバのダウンおよび通信回線の異常発生時にも同等の運用を行うことが可能です。
Connection Managerの詳細については、Connection Managerのマニュアル“Connection Managerユーザーズガイド”を参照してください。

◆注意事項

 DBMS異常が発生した場合のDBMSへの再接続は、インスタンスプールからコネクションを取得した時、またはインスタンスプールにコネクションがない場合にDBMSから直接コネクションを取得した時に行います。(DBMSへの接続を確認した時点で、トランザクションが開始し、SQL発行が可能な状態となります。)

 トランザクション中で、かつコネクションを取得した後にDBMSがダウンした場合、そのトランザクション内でDBアクセス、またはEntity Bean (CMP)にアクセス(SQL発行)を行うと例外が発生します。(この際、DBMSへの再接続は行われません。)
 この場合、JDBCコネクションをクローズしてトランザクションをロールバックしてから、再度処理を継続してください。(トランザクション管理種別がContainerの場合は、コンテナがロールバックを行います。)

 以下に、Entity Bean (CMP)で無効なコネクションを使用した場合に発生する例外を示します。

メソッド

返却される例外

create

java.rmi.RemoteException
または
javax.transaction.TransactionRolledbackException

findByPrimaryKey

find<METHOD>

remove

find<METHOD>の返却値Enumerationに対するnextElementメソッド

java.lang.RuntimeException

find<METHOD>の返却値CollectionのIteratorに対するnextメソッド

 以下に、トランザクション完了時に発生する例外を示します。

メソッド

返却される例外

commit

javax.transaction.HeuristicMixedException
または
javax.transaction.HeuristicRollbackException(トランザクションがロールバックにマークされている場合)

rollback

-

■返却される例外の詳細文字列

 J2EEアプリケーション運用中に開始したトランザクションのコミット処理の延長で、DBMSの更新処理中に例外が発生した場合、DBMSで発生した例外情報を、J2EEアプリケーションに返却できます。そのため、トランザクションコミット時に発生したデッドロックを含め、DBMSで発生した例外の検知ができます。

◆設定方法

 以下を設定してください。

パラメタ


C:\Interstage\etc\FJEJBconfig.properties

/opt/FJSVejb/etc/FJEJBconfig.properties

CommitExSQLMsg=on

◆メッセージ出力例

 commit時にデータベースの更新処理で例外が発生した場合、メッセージは以下のように出力されます。

  1. javax.transaction.HeuristicRollbackException返却時
    STATUS_ROLLEDBACK returned from commit method of UserTransaction.javax.ejb.EJBException:ErrorMsg=xxxxx,SQLState=xxxxx,ErrorCode=xx
  2. javax.transaction.HeuristicMixedException返却時
    Committing of a connection failed.ErrorMsg=xxxxx,SQLState=xxxxx,ErrorCode=xx

    【埋め込み文字について】
    ErrorMsg : SQLExceptionからgetMessage()メソッドを使用して取得した値が出力されます。
    SQLState : SQLExceptionからgetSQLState()メソッドを使用して取得した値が出力されます。DBMSによって情報が取得できない場合、文字“null”が設定されます。
    ErrorCode : SQLExceptionからgetErrorCode()メソッドを使用して取得した値が出力されます。DBMSによって情報が取得できない場合、“0”が設定されます。


目次 索引 前ページ次ページ

Copyright 2005 FUJITSU LIMITED