この章では、トランザクション失敗の原因を突き止めたり、問題修正の手段を決定したりするためのトラブルシューティング ツールおよびタスクについて説明します。
この章では、以下のトピックについて説明します。
WebLogic Server では、実行中のトランザクションをモニタし、ヒューリスティックな終了のケースで適切な情報を確実に取り込むことができます。また、データベース クエリ、トランザクション要求、および Bean メソッドのパフォーマンスをモニタすることもできます。
WebLogic Server では、トランザクションのトラブルシューティングで以下の支援を利用できます。
WebLogic JTA では、すべての標準の JTA 例外がサポートされています。標準の JTA 例外の詳細については、次の各パッケージの API Javadoc (http://java.sun.com/products/jta/javadocs-1.0.1/index.html
) を参照してください。
javax.transaction
javax.transaction.xa
標準の JTA 例外に加えて、WebLogic Server では weblogic.transaction.RollbackException
クラスが提供されます。このクラスは javax.transaction.RollbackException
を拡張し、ロールバックの元々の理由を保持します。トランザクションをロールバックする前、つまり rollbackonly
に設定する前に、アプリケーションではそのロールバックの理由を提供できます。トランザクション サービスの中で発生したすべてのロールバックではその理由が設定されます。たとえば、タイムアウト、XA エラー、beforeCompletion
での非検査例外、あるいはトランザクション マネージャへのアクセス不能などです。一度設定された理由は上書きできません。
トランザクション サービスでは、各トランザクションにトランザクション識別子 (Xid
) が割り当てられます。この ID は、ログ ファイル内で特定トランザクションの情報を他と区別するために使用できます。トランザクション識別子は、weblogic.transaction.Transaction
インタフェースの getXID
メソッドを使用して取り出すことができます。トランザクション識別子を取得するメソッドの詳細については、『Oracle Fusion Middleware Oracle WebLogic Server API Reference』の「weblogic.transaction.Transaction
」を参照してください。
WebLogic JTA では、トランザクションの命名とユーザ定義プロパティをサポートする javax.transaction.Transaction
の拡張機能が提供されます。それらの拡張機能は、weblogic.transaction.Transaction
インタフェースに含まれています。
トランザクション名は、トランザクションの種類 (送金やチケット購入など) を示します。したがって、サーバ上のユニークなトランザクションを識別するトランザクション ID とは混同しないでください。トランザクション名を利用すると、例外やログ ファイルでトランザクションの種類を簡単に識別できます。
ユーザ定義のプロパティはキーと値の組み合わせです。この場合のキーはプロパティを識別する文字列であり、値はプロパティに割り当てられた現在の値です。トランザクション プロパティの値は、Serializable
インタフェースを実装するオブジェクトでなければなりません。アプリケーションでは、weblogic.transaction.Transaction
インタフェースで定義されている set メソッドと get メソッドを使用してプロパティを管理します。一度設定されたプロパティは、有効期間が終わるまでトランザクションとともに存在し、トランザクションがシステムを移動するときにはマシン間で受け渡しされます。プロパティはトランザクション ログに保存され、クラッシュの回復処理で復元されます。トランザクション プロパティが複数回にわたって設定された場合は、最後に設定された値が保持されます。
トランザクション名とトランザクション プロパティを設定および取得するメソッドの詳細については、『Oracle Fusion Middleware Oracle WebLogic Server API Reference』の「weblogic.transaction.Transaction
」を参照してください。
Java Transaction API では、javax.transaction.Status
クラスを使用してトランザクションのステータス コードが提供されます。weblogic.transaction.Transaction
の getStatusAsString
メソッドを使用すると、トランザクションのステータスを文字列として返すことができます。文字列には、javax.transaction.Status
で指定されているメジャー ステートと、補足的なマイナー ステート (logging
や pre-preparing
など) が含まれます。
トランザクションの統計は、サーバ上のトランザクション マネージャで処理されるすべてのトランザクションについて提供されます。それらの統計には、トランザクションの総数、特定の結果 (コミット、ロールバック、ヒューリスティックな終了など) を持つトランザクションの数、ロールバックされたトランザクションの理由別の数、およびトランザクションがアクティブな状態を維持した合計時間が含まれます。トランザクションの統計に関する詳細については、Oracle Fusion Middleware Oracle WebLogic Server の Administration Console オンライン ヘルプの「JTA のモニタ」を参照してください。
Administration Console を使用すると、トランザクションをモニタできます。モニタ タスクは、サーバ レベルで実行されます。トランザクション統計は特定のサーバごとに表示されます。
特定のアプリケーションに問題があると突き止めたら、WebLogic Server のデバッグ機能をアクティブ化して、アプリケーション内の特定の問題を探し当てることができます。
デバッグは、適切な ServerDebug
コンフィグレーション属性を「true
」に設定することで有効化できます。必要に応じて、サーバの StdoutSeverity
を「Debug
」に設定することもできます。
コンフィグレーション属性は、以下のいずれかの方法で変更できます。
コマンドラインで適切なプロパティを設定します。次に例を示します。
-Dweblogic.debug.DebugJDBCJTA=true -Dweblogic.log.StdoutSeverity="Debug"
この方法は静的なものであり、サーバの起動時にのみ使用できます。
WebLogic Server Administration Console を使用して、デバッグ値を設定します。
まだ行っていない場合は、Administration Console のチェンジ センタで [ロックして編集] をクリックします (Oracle Fusion Middleware Oracle WebLogic Server の Administration Console オンライン ヘルプの「チェンジ センタの使用」を参照)。
Administration Console の左ペインで、[環境] を展開して [サーバ] を選択します。
[サーバの概要] ページで、デバッグを有効化または無効化するサーバをクリックして、そのサーバの設定ページを開きます。
[デバッグ] をクリックします。
[デフォルト] を展開します。
変更するデバッグ スコープまたは属性のチェック ボックスを選択します。
[有効化](または [無効化]) を選択して、チェックを入れたデバッグ スコープまたは属性を有効化 (または無効化) します。
Administration Console のチェンジ センタで [変更のアクティブ化] をクリックしてこれらの変更をアクティブ化します。
ただし、すべての変更がすぐに反映されるわけではなく、一部の変更は再起動するまで適用されません (Oracle Fusion Middleware Oracle WebLogic Server の Administration Console オンライン ヘルプの「チェンジ センタの使用」を参照)。
この方法は動的なものであり、サーバの実行中にデバッグを有効化するのに使用できます。
WebLogic Scripting Tool (WLST) を使用してデバッグ値を設定します。たとえば、次のコマンドでは、debug.py
というデバッグ値を設定するためのプログラムが実行されます。
java weblogic.WLST debug.py
debug.py program プログラムには、以下のコードが含まれています。
user='user1' password='password' url='t3://localhost:7001' connect(user, password, url) edit() cd('Servers/myserver/ServerDebug/myserver') startEdit() set('DebugJDBCJTA','true') save() activate()
Java からも WLST を使用することができます。次の例では、デバッグ値の設定に使用される Java ファイルを示します。
import weblogic.management.scripting.utils.WLSTInterpreter; import java.io.*; import weblogic.jndi.Environment; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; public class test { public static void main(String args[]) { try { WLSTInterpreter interpreter = null; String user="user1"; String pass="pw12ab"; String url ="t3://localhost:7001"; Environment env = new Environment(); env.setProviderUrl(url); env.setSecurityPrincipal(user); env.setSecurityCredentials(pass); Context ctx = env.getInitialContext(); interpreter = new WLSTInterpreter(); interpreter.exec ("connect('"+user+"','"+pass+"','"+url+"')"); interpreter.exec("edit()"); interpreter.exec("startEdit()"); interpreter.exec ("cd('Servers/myserver/ServerDebug/myserver')"); interpreter.exec("set('DebugJDBCJTA','true')"); interpreter.exec("save()"); interpreter.exec("activate()"); } catch (Exception e) { System.out.println("Exception "+e); } } }
WLST の使用は動的な手法で、サーバの実行中にデバッグを有効化するために使用できます。
コンソール、WLST、またはコマンドラインでデバッグ特性を変更すると、その内容が config.xml
ファイルに反映されます。コード リスト 13-1 を参照してください。
コード リスト 13-1 JTA のデバッグ スタンザのサンプル
. . .<server> <name>myserver</name> <server-debug> <debug-scope> <name>weblogic.transaction</name> <enabled>true</enabled> </debug-scope> <debug-jdbcjta>true</debug-jdbcjta> </server-debug> </server> . . .
以下の config.xml
のサンプル (抜粋) に、トランザクション デバッグのスコープ (複数のデバッグ属性) および 1 つの JTA 属性を示します。
java weblogic.diagnostics.debug.DebugScopeViewer
を使うと DebugScope 定義をツリー表示できます。
以下に示す JTA 用の登録済みデバッグ スコープを有効化できます。
DebugJDBCJTA
(スコープ weblogic.jdbc.transaction) - 未使用
DebugJTAXA
(スコープ weblogic.transaction.xa) - XA リソースのトレース
DebugJTANonXA
(スコープ weblogic.transaction.nonxa) - 非 XA リソースのトレース
DebugJTAXAStackTrace
(スコープ weblogic.transaction.stacktrace) - さまざまな重要な場所でのスタック トレースを出力する詳細なトレース
DebugJTARMI
(スコープ weblogic.transaction.rmi) - 未使用
DebugJTA2PC
(スコープ weblogic.transaction.twopc) - すべての 2 フェーズ コミット処理のトレース
DebugJTA2PCStackTrace
(スコープ weblogic.transaction.twopcstacktrace) - スタック トレースを出力する詳細な 2 フェーズ コミット トレース
DebugJTATLOG
(スコープ weblogic.transaction.tlog) - トランザクション ロギング情報のトレース
DebugJTAJDBC
(スコープ weblogic.transaction.jdbc, weblogic.jdbc.transaction) - JTA レコードの読み書きに関する情報のトレース
DebugJTARecovery
(スコープ weblogic.transaction.recovery) - 回復情報のトレース
DebugJTAGateway
(スコープ weblogic.transaction.gateway) - インポートされたトランザクションに関する情報のトレース
DebugJTAGatewayStackTrace
(スコープ weblogic.transaction.gatewaystacktrace) - インポートされたトランザクションに関連するスタック トレース
DebugJTANaming
(スコープ weblogic.transaction.naming) - トランザクションの命名情報のトレース
DebugJTANamingStackTrace
(スコープ weblogic.transaction.namingstacktrace) - トランザクションの命名情報のトレース
DebugJTAResourceHealth
(スコープ weblogic.transaction.resourcehealth) - XA トランザクション リソースの状態に関する情報のトレース
DebugJTAMigration
(スコープ weblogic.transaction.migration) - トランザクション ログの移行に関する情報のトレース
DebugJTALifecycle
(スコープ weblogic.transaction.lifecycle) - トランザクション サーバのライフサイクル (初期化、中断、再開、停止) に関する情報のトレース
DebugJTALLR
(スコープ weblogic.transaction.llr) - すべてのロギング ラスト リソース処理のトレース
DebugJTAHealth
(スコープ weblogic.transaction.health) - トランザクション サブシステムの状態に関する情報のトレース
DebugJTATransactionName
(スコープ weblogic.transaction.name) - トランザクション名のトレース
DebugJTAResourceName
(スコープ weblogic.transaction.resourcename) - トランザクション リソース名のトレース