XOP/MTOM について
XOP/MTOM についてちょっと調べたのでメモで残しておく。
情報はちょっと古いけどだいたい以下のような感じ。
XOP と MTOM は、SOAP メッセージの中に添付として含まれる
バイナリー・データの伝送をサポートするための標準。
これまで Microsoft は、DIME (Direct Internet Message Encapsulation)
と呼ばれる添付技術しかサポートしておらず、一方大部分のフレームワークでは、
それ以前に Microsoft が提案した SwA (SOAP Messages with Attachments)
と呼ばれるものしかサポートしていなかった。
XOP/MTOM は連携し、XML バイナリー最適化パッケージ
(XOP: XML-binary Optimized Packaging) で XML 文書が論理的に任意の
バイナリー・データの塊を組み込めるようにし、
MTOM (SOAP Message Transmission Optimization Mechanism) で XOP 手法を
SOAP メッセージに適用している。
XOP は base64 エンコード方式の文字データ・コンテンツを処理する。
XOP は実際の base64 テキストを XOP 名前空間の特殊な「Include」要素に置き換える。
Include 要素は、個別エンティティー (XML 文書の外部にあって、XML 文書に組み込まれる
実際のデータ) を識別する URI を指定する。
<xop:Include href="cid:1.urn:uuid:966CA4565647BEBA3D115028348657315@apache.org" xmlns:xop="http://www.w3.org/2004/08/xop/include" />
MTOM は XOP に基づき、まず SOAP メッセージで可能な XOP 使用方法の
抽象モデルを定義し、次にそのモデルを MIME Multipart/Related パッケージ用に
特殊化して、最後に HTTP トランスポートにモデルを適用する。
このメカニズム全体が、広く使用されている HTTP トランスポートで
XOP を SOAP メッセージに適用する標準方法となっている。
Oracle のアーカイブ・ログを削除する方法
Oracle のアーカイブ・ログは以下の手順で削除可能。
$ rman target / ← Oracle ユーザで実行 RMAN> delete archivelog all; ← すべてのアーカイブ・ログを削除
RMAN とは、Oracle の Recovery Manager のこと。
ちなみに、Linux のディストリビューションによっては rman というコマンドがあり、
このコマンドが呼ばれて以下のようなメッセージが出て失敗する。
rman: can't open target
この場合、パスの先頭に $ORACLE_HOME/bin を通しておくか、
$ORACLE_HOME/bin にある rman コマンドを直接実行すれば ok。
DTD 503 Error
この間、Xerces を使った XML ドキュメントのパース時に以下のエラーが発生した。
Caused by: java.io.IOException: Server returned HTTP response code:
503 for URL: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
どうやら W3C のサイトにある DTD に頻繁にアクセスが発生し負担になったため
制限しているらしい。(W3C Systeam's blog - W3C's Excessive DTD Traffic)
Xerces を使って XML ドキュメントをパースする際には、以下の方法で DTD の
バリデーションをオフにすることもできるが、
setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
これだと DTD に定義されている実体参照を参照している場合に、
参照先の文字列に展開されないなどの問題が発生する。
EntityResolverを使えば、ローカルの DTD にアクセスするように変更することも
できそうだが、プログラムの修正が必要になる。
プログラムの修正をせずになんとか DTD にアクセスできないか調査したところ、
HTTP の「User-Agent」で制限していることが分かった。現在のところ以下の
条件にマッチした「User-Agent」の場合、W3C の DTD にアクセスできないことが
分かっている。
例えば、「Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)」や
「Java/1.5.0_12」だと、上記条件にマッチして W3C の DTD にアクセスできない。
回避策としては「User-Agent」を上記条件にマッチしないように設定すればいいわけで、
プログラムの修正が可能であれば、 URLConnection クラスの setRequestProperty()
メソッドで任意の「User-Agent」をセットすればいいのだが、今回はプログラムの
修正はしたくないのでシステムプロパティ「http.agent」に任意の文字列をセット
するようすればいい。
そうすれば、例えば Java 1.5.0_12 だと「User-Agent」は以下のようになる。
<任意の文字列> Java 1.5.0_12
懸念事項としては、W3C で制限している条件が「Java/<数字> で始まる」ではなく、
「Java を含む」などにした場合、上記対応では回避できなくなるということだ。
まあ、全うなやり方はやっぱりEntityResolverかな。
ORA-12547 が発生してデータベースが作成できない
この前 RHEL 4 x64 環境に Oracle 10g R2 をインストールしたところ、
データベースの作成で以下のエラーが発生した。
ORA-12547: TNS: 接続を失いました。
よくよく調べてみると、libaio.so は i386 版だけでなく、x86_64 版も必要らしい。
RHEL 4 のインストールメディアの 4 枚目にある libaio-0.3.105-2.x86_64.rpm を
以下のコマンドでインストールしたところ、無事にデータベースが作成できた。
Oracle のマニュアルには、デフォルトの状態で x86_64 版の libaio.so が
インストールされていて、i386 版の libaio.so だけ追加でインストールすれば
いいとのことだったが、自分の環境には x86_64 版の libaio.so も追加で
インストールする必要があった。
これはハマった・・・。