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