この章では、Oracle XML DBアプリケーションをJavaで作成する方法を説明します。サーブレットを含むJavaアプリケーションを作成する場合の設計のガイドライン、およびOracle XML DBサーブレットを構成する方法を説明します。
この章の内容は次のとおりです。
Oracle XML DBは、Javaプログラマに次の2つの主要なアーキテクチャを提供します。
データベースでのJava仮想マシン(JVM)の使用。
クライアント・サーバーまたはアプリケーション・サーバーでのJDBC Thickドライバの使用。アプリケーション・サーバーは、アプリケーションおよびその環境をホストするために設計されたサーバーであり、サーバー・アプリケーションの実行を許可します。代表的な例はOracle Application Serverで、リモート・クライアントがインタフェースを制御する場合に、Java、C、C++およびPL/SQLアプリケーションをホストできます。Oracle Application Serverは、オープン標準フレームワーク内で高パフォーマンスのN層トランザクション指向Webアプリケーションを構築、デプロイおよび管理するために必要な、すべての主要なサービスおよび機能を統合します。
データベース内のJavaは、データベース・サーバー・プロセスのコンテキストで実行されるため、Javaコードをデプロイする方法は、次のいずれかに制限されます。
SQLまたはPL/SQLから起動するストアド・プロシージャとしてJavaコードを実行できます。
Javaサーブレットを実行できます。
ストアド・プロシージャは、SQLコードおよびPL/SQLコードと簡単に統合でき、Oracle DatabaseにアクセスするプロトコルとしてOracle Net Servicesを使用する必要があります。
サーブレットは、Oracle Databaseへの最上位のエントリ・ポイントとしてより適切に機能し、Oracle DatabaseにアクセスするプロトコルとしてHTTP(S)を使用する必要があります。
JavaでOracle XML DBアプリケーションを作成するアーキテクチャを選択する場合は、次のガイドラインを考慮します。
ダウンストリーム・クライアントがXMLをテキスト表現で処理する場合、HTTP(S)を使用してJavaサーブレットにアクセスするか、またはXMLType
リソースに直接アクセスする方法が最適です。この方法は、特にJavaプログラムによるXMLノード・ツリーの操作が少ない場合に有効です。
サーバーにJavaを実装すると、UCS-2 Unicode(Java文字列に必要です)で文字データを変換せずに、データをデータベースからネットワークへネイティブに移動できます。多くの場合、データはデータベースのバッファ・キャッシュからHTTP(S)接続に直接コピーされます。データをバッファ・キャッシュから、Oracle Net Servicesで使用されるSQLのシリアライズ・フォーマットに変換し、それをJDBCクライアントに移して、XMLに変換する必要はありません。データベース・サーバー内部では、XMLType
のロード・オンデマンドおよびLRUキャッシュが最も効率的です。
ダウンストリーム・クライアントが、JavaプログラムによってXMLType
インスタンスの多く、またはほとんどの要素にアクセスするアプリケーションである場合は、最適のパフォーマンスのためJDBC XMLType
サポートを使用します。また、Javaプログラムのデバッグは、通常、データベース・サーバーの外部で行う方が簡単です。
Oracle XML DBサーブレットは、HTTP(S)を使用してアクセス可能なHTTPストアド・プロシージャをJavaで作成するためのものです。インターネット・アプリケーション全体を開発することを目的としたプラットフォームではありません。その場合、Oracle Application Serverのアプリケーション・サーバーにアプリケーション・サーブレットをデプロイし、JDBCを使用するか、またはjava.net.*
や同様のAPIを使用してデータベース内のデータにアクセスし、HTTP(S)を使用してXMLデータを取得する必要があります。
サーブレットは、エンドユーザーのためにHTMLページをフォーマットするのではなく、データベースにアクセスし、データを操作して、そのデータをXMLとして迅速に書き込むアプリケーションに最適です。
Oracle XML DBは、FTP、HTTP 1.1、WebDAVおよびJavaサーブレットをサポートするプロトコル・サーバーを提供します。今回のリリースでは、Javaサーブレットのサポートは不完全ですが、今後のリリースで、完全に準拠するためのサブセットが提供されます。現在、Oracle XML DBは、Javaサーブレットのバージョン2.2をサポートします。ただし、次の例外があります。
サーブレットのWARファイル(web.xml
)はサポートされません。手動で操作する必要があるweb.xml
構成パラメータが存在します。たとえば、ロールの作成は、SQL CREATE ROLE
コマンドを使用して行う必要があります。
RequestDispatcher
および関連付けられたメソッドはサポートされません。
HTTPServletRequest.getCookies()
メソッドはサポートされません。
現在、1つのServletContext
(および1つのWebアプリケーション)のみがサポートされています。
ステートフル・サーブレット(およびHttpSession
クラスのメソッド)は、サポートされません。サーブレットは、データベース自体の状態を保持する必要があります。
Oracle XML DBサーブレットは、Oracle XML DBリポジトリの/xdbconfig.xml
ファイルを使用して構成されます。このファイル内の多くのXML要素は、Java 2 Enterprise Edition(J2EE)のJavaサーブレット2.2仕様部分に定義されているものと同じであり、同じセマンティクスを持ちます。表32-1に、Javaサーブレットの仕様でサーブレット・デプロイメント・ディスクリプタに対して定義されたXML要素、およびOracle XML DBがサポートする拡張要素を示します。
表32-1 サーブレット・デプロイメント・ディスクリプタに対して定義されたXML要素
XML要素名 | 定義元 | サポートの有無 | 説明 | コメント |
---|---|---|---|---|
|
Java |
非サポート |
アクセスに必要なHTTP認証方式を指定します。 |
-- |
|
Oracle |
サポート |
IANAキャラクタ・セット名を指定します。 |
ISO8859、UTF-8などです。 |
|
Oracle |
サポート |
ファイル名の拡張子とキャラクタ・セットの間のマッピングを指定します。 |
-- |
|
Java |
非サポート |
Webアプリケーション用のパラメータを指定します。 |
現在はサポートされていません。 |
|
Java |
サポート |
サーブレットまたはWebアプリケーションを説明する文字列です。 |
サーブレット用にサポートされています。 |
|
Java |
サポート |
サーブレットまたはWebアプリケーションで表示する文字列です。 |
サーブレット用にサポートされています。 |
|
Java |
非サポート |
すべてのインスタンスが同じJava仮想マシンで実行していない場合に、このサーブレットが機能できるかどうかを示します。 |
Oracle Databaseで実行するすべてのサーブレットは、distributableである必要があります。 |
|
Oracle |
サポート |
Oracleエラー番号です。 |
『Oracle Databaseエラー・メッセージ』を参照してください。 |
|
Java |
サポート |
HTTP(S)エラー・コードです。 |
RFC 2616で定義されています。 |
|
Java |
サポート |
エラーが発生した場合のリダイレクト先のURLを定義します。 |
HTTP(S)エラー、不明なJava例外または不明なOracleエラー・メッセージで指定できます。 |
|
Java |
サポート |
エラー・ページにマップされたJava例外のクラス名です。 |
-- |
|
Java |
サポート |
MIMEタイプやキャラクタ・セットなどに関連付けるために使用するファイル名の拡張子です。 |
-- |
|
Oracle |
サポート |
エラー・ページをマッピングするためのOracle機能コードです。 |
ORA、PLSなどです。 |
|
Java |
非サポート |
フォーム・ログインの試行に対するエラー・ページです。 |
現在はサポートされていません。 |
|
Java |
非サポート |
フォームベースのログインの構成仕様です。 |
現在はサポートされていません。 |
|
Java |
非サポート |
フォームベースのログイン・ページのURLです。 |
現在はサポートされていません。 |
|
Java |
サポート |
サーブレットに関連付けられたアイコンのURLです。 |
サーブレット用にサポートされています。 |
|
Java |
サポート |
サーブレットの初期化パラメータです。 |
-- |
|
Java |
非サポート |
サーブレットに使用するJavaServer Pagesファイルです。 |
サポートされていません。 |
|
Oracle |
サポート |
IANA言語名です。 |
en-USなどです。 |
|
Oracle |
サポート |
ファイル名の拡張子と言語コンテンツの間のマッピングを指定します。 |
-- |
|
Java |
サポート |
アイコン表示用の大きいサイズのアイコンです。 |
-- |
|
Java |
サポート |
サーブレットの起動時にロードするかどうかを指定します。 |
-- |
|
Java |
サポート |
エラー・ページのURLを指定します。 |
ローカル・パス名またはHTTP(S) URLを指定できます。 |
|
Java |
非サポート |
認証方式を指定します。 |
現在はサポートされていません。 |
|
Java |
サポート |
コンテンツのファイル名の拡張子とMIMEタイプの間のマッピングを指定します。 |
-- |
|
Java |
サポート |
リソース・コンテンツのMIMEタイプ名です。 |
text/xml、application/octet-streamなどです。 |
|
Oracle |
サポート |
エラー・ページに関連付けるOracleエラーを指定します。 |
-- |
|
Java |
サポート |
サーブレットまたは |
サーブレット用にサポートされています。 |
|
Java |
サポート |
パラメータの値です。 |
-- |
|
Java |
非サポート |
認証に使用するHTTP(S)レルムです。 |
現在はサポートされていません。 |
|
Java |
サポート |
特定のユーザーがサーブレットにアクセスするために必要なロールを指定します。 |
データベース・ロール名を参照します。デフォルトでは、大文字にする必要があります。 |
|
Java |
サポート |
ロールのサーブレット名です。 |
データベース・ロールを呼び出すための別の名前です。サーブレットのAPIで使用します。 |
|
Java |
非サポート |
サーブレットが使用するロールを定義します。 |
サポートされていません。ロールは、SQLの |
|
Java |
サポート |
サーブレットとロール間の参照です。 |
-- |
|
Java |
サポート |
サーブレットの構成情報です。 |
-- |
|
Java |
サポート |
Javaサーブレットのクラス名を指定します。 |
-- |
|
Oracle |
サポート |
サーブレットを作成するプログラミング言語を指定します。 |
Java、C、PL/SQLのいずれかです。現在、顧客定義のサーブレットには、Javaのみがサポートされています。 |
|
Java |
サポート |
サーブレットを関連付けるファイル名のパターンを指定します。 |
Javaで定義されたすべてのマッピングがサポートされています。 |
|
Java |
サポート |
サーブレットの文字列名です。 |
サーブレットのAPIで使用します。 |
|
Oracle |
サポート |
JavaクラスがロードされるOracleスキーマです。指定しない場合、デフォルトのリゾルバ仕様を使用してスキーマが検索されます。 |
これが指定されない場合、サーブレットを |
|
Java |
非サポート |
|
|
|
Java |
非サポート |
HTTP(S)セッションのタイムアウトです。 |
|
|
Java |
サポート |
サーブレットに関連付けられた小さいアイコンです。 |
-- |
|
Java |
非サポート |
JSPタグ・ライブラリです。 |
JSPは現在サポートされていません。 |
|
Java |
非サポート |
|
JSPは現在サポートされていません。 |
|
Java |
非サポート |
タグ・ライブラリが格納されているWebアプリケーションのルートに相対的なパス名です。 |
JSPは現在サポートされていません。 |
|
Java |
サポート |
サーブレットに関連付けられたURLパターンです。 |
Javaサーブレット2.2仕様の第10項を参照してください。 |
|
Java |
非サポート |
Webアプリケーションの構成です。 |
現在、1つのWebアプリケーションのみがサポートされています。 |
|
Java |
サポート |
ウェルカム・ファイルの名前を指定します。 |
-- |
|
Java |
サポート |
HTTP |
|
注意:
|
Oracle XML DBは、次の手順を実行してHTTPリクエストを処理します。
接続が確立されていない場合、Oracleリスナーは接続を共有サーバー・ディスパッチャに渡します。
新しいHTTPリクエストを受信すると、ディスパッチャは共有サーバーを起動します。
HTTPヘッダーは、適切な構造に解析されます。
共有サーバーは、Oracle XML DBセッション・プールが使用可能な場合、そこからデータベース・セッションの割当てを試行します。Oracle XML DBセッション・プールが使用できない場合、新しいセッションを作成します。
新しいデータベース・コールおよび新しいデータベース・トランザクションが開始されます。
HTTP(S)に認証ヘッダーが含まれている場合、セッションはそのデータベース・ユーザーとしてSQL*Plusにログインしている場合と同様に認証されます。認証情報が含まれず、リクエストがGET
またはHEAD
である場合、Oracle XML DBはセッションをANONYMOUS
ユーザーとして認証しようとします。このデータベース・ユーザーのアカウントがロックされている場合、認証されないアクセスは許可されません。
Javaサーブレット2.2の仕様で指定されているとおり、HTTPリクエストのURLがxdbconfig.xml
ファイルのサーブレットと一致しているかどうかが確認されます。
Oracle XML DBサーブレット・コンテナは、Oracle内部のJava VMで起動されます。指定したサーブレットが初期化されていない場合は、初期化されます。
サーブレットは、ServletInputStream
から入力を読み取り、ServletOutputStream
に出力を書き込み、service()
メソッドから戻ります。
不明なOracleエラーが発生した場合、セッションはセッション・プールに戻されます。
Oracle Databaseは、データベース・セッションごとに1つのJVMを保持します。これは、セッション・プールから再利用されるセッションが、セッションが最後に使用されてからは、JVM(Java静的変数)内でどのような状態にもなることを意味します。
これは、メタデータなど、ユーザー固有でないJava状態をキャッシュする場合に有効ですが、保護ユーザーのデータはJava静的メモリーに格納しないでください。保護ユーザーのデータをJava静的メモリーに格納した場合、アプリケーションによってセキュリティ・ホールが出現する可能性があります。
DOM
ノード・クラスは、write()
というOracle固有のメソッドを持ちます。このメソッドは次の引数を取り、voidを戻します。
java.io.OutputStream
ストリーム: XMLテキストの書き込み先Javaストリーム。
String charEncoding
: XMLテキストを書き込むキャラクタ・エンコーディング。NULL
の場合、データベース・キャラクタ・セットが使用されます。
Short
indent
: ネストしたXML要素のインデントの文字数。
提供されたストリームがデータベース内部で提供されるServletOutputStream
である場合、このメソッドには、ショートカットが実装されます。ノードのコンテンツは、出力ソケットにネイティブなコードのXMLで直接書き込まれます。これによって、JavaオブジェクトまたはUnicode(Java文字列に必要)との間の変換が回避され、パフォーマンスが向上します。
Oracle XML DBサーブレットでサポートされるAPIは、Javaサーブレット2.2仕様で定義されます。現在、Javaサーブレット2.2仕様のJavadocは、http://java.sun.com/products/servlet/2.2/javadoc/index.html
のサイトで参照できます。
表32-2に、未実装のJavaサーブレット2.2メソッドをリストします。実行時に例外が発生します。
次に、URLに指定されたパラメータをパス名として読み取り、そのXML文書のコンテンツを出力ストリームとして書き込む単純なサーブレットの例を示します。
サーブレット・コードは、次のようになります。
/* test.java */ import javax.servlet.http.*; import javax.servlet.*; import java.util.*; import java.io.*; import javax.naming.*; import oracle.xml.parser.v2.*; public class test extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { OutputStream os = resp.getOutputStream(); Hashtable env = new Hashtable(); XMLDocument xt; try { env.put(Context.INITIAL_CONTEXT_FACTORY, "oracle.xdb.spi.XDBContextFactory"); Context ctx = new InitialContext(env); String [] docarr = req.getParameterValues("doc"); String doc; if (docarr == null || docarr.length == 0) doc = "/foo.txt"; else doc = docarr[0]; xt = (XMLDocument)ctx.lookup(doc); resp.setContentType("text/xml"); xt.print(os, "ISO8859"); } catch (javax.naming.NamingException e) { resp.sendError(404, "Got exception: " + e); } finally { os.close(); } } }
このサーブレットをインストールしてコンパイルし、Oracle Databaseにロードするには、次のコマンドを使用します。
% loadjava –grant public –u quine/curry –r test.class
Oracle XML DBサーブレットを構成するには、次のXML要素ツリーをservlet-list
要素に挿入して/xdbconfig.xml
ファイルを更新します。
<servlet> <servlet-name>TestServlet</servlet-name> <servlet-language>Java</servlet-language> <display-name>Oracle XML DB Test Servlet</display-name> <servlet-class>test</servlet-class> <servlet-schema>quine</servlet-schema> </servlet>
また、次のXML要素ツリーを<servlet-mappings>
要素に挿入して、/xdbconfig.xml
ファイルを更新します。
<servlet-mapping> <servlet-pattern>/testserv</servlet-pattern> <servlet-name>TestServlet</servlet-name> </servlet-mapping>
/xdbconfig.xml
ファイルは、任意のWebDAV対応テキスト・エディタまたはSQL関数updateXML
を使用して編集できます。
注意: SYS であっても、ファイル/xdbconfig.xml は削除できません。 |