[WLS, Database] Using SQLXML Data Type with Application Continuity

原文はこちら。
https://blogs.oracle.com/WebLogicServer/entry/using_sqlxml_data_type_with

Oracle具象クラスのApplication Continuity(AC)で動作するためのインターフェースに変更されたことについての記事を初めて書いたとき、1個の型を除外していました。
Using Oracle JDBC Type Interfaces
https://blogs.oracle.com/WebLogicServer/entry/using_oracle_jdbc_type_interfaces
https://orablogs-jp.blogspot.jp/2013/07/using-oracle-jdbc-type-interfaces.html
oracle.sql.OPAQUEはoracle.jdbc.OracleOpaqueに置き換えられています。この不透明なデータ型でできることは多くはありません。元のクラスにはたくさんの変換メソッドがあったのに対し、この新しいOracleの型インターフェースには重要、もしくは標準JDBC APIでは利用できないと考えられるメソッドのみがあります。この新しいインターフェースにはObjectとしての値を取得するメソッドと、メタデータと型の名称を取得するための2個のメタ情報のメソッドしかありません。java.sql.Structを拡張したoracle.jdbc.OracleStructや、java.sql.Arrayを拡張したoracle.jdbc.OracleArrayといった、その他のOracleの型インターフェースとは異なり、oracle.jdbc.OracleOpaqueはJDBCインターフェースを拡張していません。
ACで動作するよう変更が必要な非常によくある、関連するユースケースがあります。SQLXMLの初期の用途は、以下のXDB APIの利用でした。
SQLXML sqlXml = oracle.xdb.XMLType.createXML( ( ( oracle.jdbc.OracleResultSet )resultSet ).getOPAQUE( "issue" ) );
oracle.xdb.XMLTypeはoracle.sql.OPAQUEを拡張しており、それの用途はACのリプレイを無効化するものです。これを標準的な以下のJDBC APIで置き換えなければなりません。
SQLXML sqlXml = resultSet.getSQLXML("issue");
replayデータソースを使っている場合に “new oracle.xdb.XMLType(connection, string)” を実行しようとすると、ClassCastExceptionが発生します。XMLTypeがreplayデータソースでは使えず、oracle.xdbパッケージがXMLTypeを広く使っているため、このパッケージはACのreplay機能で利用することはできません。
SQLXMLのAPIは以下のドキュメントをご覧下さい。
このjavadocによると、APIはDOM、SAX、StAX、XSLT、XPathで使えるとあります。
こちらにサンプルプログラムがあります。
このサンプルではStAXを使って情報を格納し、DOMを使って情報を取得しています。デフォルトでは、このサンプルはreplayデータソースを使っており、XDBを使っていません。
以下のように設定することで、replayデバッグを使って実行することができます。下記の内容を含む/tmp/config.txtというファイルを作成してください。
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
handlers = java.util.logging.FileHandler
java.util.logging.FileHandler.pattern = /tmp/replay.log
oracle.jdbc.internal.replay.level = FINEST
WebLogic ServerのCLASSPATH、もしくはOracle Databaseのclient.jarファイルをもつCLASSPATHを変更して、ojdbc7_g.jarをCLASSPATHの先頭に配置してojdbc7.jarを置き換えるように設定します。さらにカレント・ディレクトリをCLASSPATHに追加してください。
(拡張子を.txtから.javaに変更後)プログラムをコンパイルして、以下のコマンドを使って実行してください。
java -Djava.util.logging.config.file=/tmp/config.txt XmlSample
replayのログは/tmp/replay.logに出力されます。サンプルプログラムのデフォルトを使う場合、replayが無効化されていることがログからはわかりませんが、このプログラムを変更してuseXdbをtrueに設定すると、replayが無効化されていることがわかるでしょう。このログには以下の2個の文字列が現れます。
“DISABLE REPLAY in preForMethodWithConcreteClass(getOPAQUE)”
“Entering disableReplayInternal”
このサンプルを使って別のオペレーション・シーケンスをテストし、replayで安全かどうかを確認することができます。
代替策として、orachkを使ってクラスの静的分析を実行することができます。詳細は以下のエントリをご覧下さい。
Using Orachk to Clean Up Concrete Classes for Application Continuity
https://blogs.oracle.com/WebLogicServer/entry/using_orachk_to_clean_up
このサンプルプログラムに対してorachkを実行すると、以下のエラーが出るはずです。
FAILED - [XmlSample][[MethodCall] desc= (Ljava/lang/String;)Loracle/sql/OPAQUE; method name=getOPAQUE, lineno=105]

0 件のコメント:

コメントを投稿