15 トランザクションのトラブルシューティング
概要
WebLogic Serverでは、実行中のトランザクションをモニターし、ヒューリスティックな終了のケースで適切な情報を確実に取り込むことができます。また、データベース問合せ、トランザクション・リクエスト、およびBeanメソッドのパフォーマンスをモニターすることもできます。
トラブルシューティング・ツール
WebLogic Serverでは、トランザクション・トラブルシューティングに対して例外、トランザクション識別子、トランザクション・ステータスなどの支援を提供します。
このトピックには次のセクションがあります。
例外
WebLogic JTAでは、すべての標準のJTA例外がサポートされています。標準JTA例外の詳細は、次のパッケージに対するAPI Javadocを参照してください。
標準のJTA例外に加えて、WebLogic Serverはweblogic.transaction.RollbackException
クラスを提供します。このクラスはjavax.transaction.RollbackException
を拡張し、ロールバックの元々の理由を保持します。トランザクションをロールバックする前、つまりrollbackonly
に設定する前に、アプリケーションではそのロールバックの理由を提供できます。トランザクション・サービスの中で発生したすべてのロールバックではその理由が設定されます。たとえば、タイムアウト、XAエラー、beforeCompletion
での非検査例外、あるいはトランザクション・マネージャへのアクセス不能などです。一度設定された理由は上書きできません。
TLOGストアおよびSQL問合せを使用してデータベースにログインする際に、30秒以上かかるとSystemException: Transaction could not be logged
がスローされます。この問題を解決するには、データベース・パフォーマンスおよび自動ワークロード・リポジトリ・レポートを参照して、遅くなっている原因を把握し、適宜データベース・チューニングを行います。
トランザクション識別子
トランザクション・サービスでは、各トランザクションにトランザクション識別子(Xid
)が割り当てられます。このIDは、ログ・ファイル内で特定トランザクションの情報を他と区別するために使用できます。トランザクション識別子は、weblogic.transaction.Transaction
インタフェースのgetXID
メソッドを使用して取り出すことができます。トランザクション識別子を取得するメソッドの詳細は、Oracle WebLogic Server Java APIリファレンスの
weblogic.transaction.Transactionを参照してください。
トランザクションの名前とプロパティ
WebLogic JTAでは、トランザクションの命名とユーザー定義プロパティをサポートするjavax.transaction.Transaction
の拡張機能が提供されます。これらの拡張機能は、weblogic.transaction.Transaction
インタフェースに含まれています。
トランザクション名は、トランザクションの種類(送金やチケット購入など)を示します。したがって、サーバー上の一意のトランザクションを識別するトランザクションIDとは混同しないでください。トランザクション名を利用すると、例外やログ・ファイルでトランザクションの種類を簡単に識別できます。
ユーザー定義のプロパティはキーと値の組み合わせです。この場合のキーはプロパティを識別する文字列であり、値はプロパティに割り当てられた現在の値です。トランザクション・プロパティの値は、Serializable
インタフェースを実装するオブジェクトでなければなりません。アプリケーションでは、weblogic.transaction.Transaction
インタフェースで定義されているsetメソッドとgetメソッドを使用してプロパティを管理します。一度設定されたプロパティは、存続期間が終わるまでトランザクションとともに存在し、トランザクションがシステムを移動するときにはマシン間で受け渡しされます。プロパティはトランザクション・ログに保存され、クラッシュのリカバリ処理で復元されます。トランザクション・プロパティが複数回にわたって設定された場合は、最後に設定された値が保持されます。
トランザクション名とトランザクション・プロパティを設定および取得するメソッドの詳細は、Oracle WebLogic Server Java APIリファレンス.の
weblogic.transaction.Transactionを参照してください。
トランザクション・ステータス
Java Transaction APIでは、javax.transaction.Status
クラスを使用してトランザクションのステータス・コードが提供されます。weblogic.transaction.Transaction
のgetStatusAsString
メソッドを使用すると、トランザクションのステータスを文字列として返すことができます。文字列には、javax.transaction.Status
で指定されているメジャー状態と、追加のマイナー状態(logging
やpre-preparing
など)が含まれます。
トランザクションの統計
トランザクションの統計は、サーバー上のトランザクション・マネージャで処理されるすべてのトランザクションについて提供されます。それらの統計には、トランザクションの総数、特定の結果(コミット、ロールバック、ヒューリスティックな終了など)を持つトランザクションの数、ロールバックされたトランザクションの理由別の数、およびトランザクションがアクティブな状態を維持した合計時間が含まれます。トランザクションの統計に関する詳細は、Oracle WebLogic Server管理コンソール・オンライン・ヘルプのJTAの監視に関する項を参照してください。
JTAリソースのデバッグ
特定のアプリケーションに問題があると突き止めたら、WebLogic Serverのデバッグ機能をアクティブ化して、アプリケーション内の特定の問題を探し当てることができます。
デバッグを有効化する
デバッグは、適切なServerDebug
構成属性を「true」
に設定することで有効化できます。必要に応じて、サーバーのStdoutSeverity
を「Debug」
に設定することもできます。
構成属性は、以下のいずれかの方法で変更できます。
コマンド・ラインを使用してデバッグの有効化
コマンド行で適切なプロパティを設定します。たとえば、
-Dweblogic.debug.DebugJDBCJTA=true -Dweblogic.log.StdoutSeverity="Debug"
この方法は静的なものであり、サーバーの起動時にのみ使用できます。
WebLogic Scripting Toolを使用してデバッグの有効化
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の使用は動的な方法であり、サーバーの実行中にデバッグを有効化できます。
config.xmlファイルの変更内容
WebLogic Server管理コンソール、WLSTまたはコマンド行を使用してデバッグ特性を変更すると、その内容がconfig.xml
ファイルに反映されます。例15-1を参照してください。
例15-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属性を示します。
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) - トランザクション・リソース名のトレース