酒井法雄 SAKAI,Norio



RDBMSベンダーから脱皮を図るOracle

 Oracleといえば,Oracle7,そしてOracle8 ServerといったRDBMSを思い浮かべる.つまり,OracleはRDBMSベンダーだと思いがちである.たしかにそれも正しい.
 Oracle7 Serverは,あらゆる処理をパラレルで実行していこうというものであり,折りからのダウンサイジングの波もあり,大きな支持を得た.そして,最近リリースされたOracle8では,オブジェクト指向を取り入れ,データハウジング的機能も取り込んだ方向に進化してきている.しかし,Oracle8の新機能と言えるようなものは比較的地味なもので,大量のデータに対応するためのしくみなどが売りである.
 今のOracleはOracle8というRDBMSサーバーだけの会社ではなく,インターネットやイントラネットでのRDBMSソリューションをトータルに提供するために,Oracle8 Serverだけではなく,NCやツール,WWWまわりのしくみなどを強化している.つまり,RDBMSのベンダーから,ネットワークコンピューティングベンダーへ,Oracleは移行しようとしているのである.

NCAとは

 このシナリオがOracleのNCA(Network Computing Architechture)である(図1).NCAは,WebベースでのRDBMSアクセスの限界を超え,さまざまなソリューションを展開する.

図1:NCAのしくみ

 Webベースの情報システムで重要なのは,Thinクライアントという考え方で,すべての処理をサーバーサイドに集中させ,クライアント側にはWebブラウザさえあれば,すべてのアクセスが可能になるという方法だ.これは,従来からあるCGIを使ったRDBMSアクセスでも可能である.
 しかし,より柔軟性を持たせるためには,Javaアプレットなどの積極利用が重要になる.また,ステートレスなHTTPでは実現できないトランザクションの管理も必要だ.これらは,それに適したソフトウェアのしくみを用意すればよい.さらに,Thinクライアントをより低価格に実現するために,NCが提案されているわけだ.
 このように,ネットワークコンピューティングを実現するために,Oracleはさまざまなソフトウェアを続々と発表している.そんな中に出てきたOracle8であるから,一見地味な印象を受けてしまうが,こういったネットワークコンピューティングの世界でも,Oracleの中心となるのは,やはりOracle Serverであることは間違いない.

分散オブジェクト環境

 HTTPとHTMLベースの従来からのWebシステムでは,次のような問題があった.

これらの問題を解決するために,クライアントサイドでJavaアプレットなどのプログラムが動くようにするという解決法が考えられた.そのプログラムの中で,Webサーバーとは別にRDBMSにアクセスするセッションを維持し,従来のC/Sシステムと同様な柔軟性を持たせるのだ.
 これは,すなわち従来から言われている分散オブジェクト技術なのである.Webに限ったソリューションではない.そして,この技術にも,Microsoft V.S. 反Microsoftという構図がある.
 このための規格を吟味してきたOMG(Object Management Group)は,CORBA(Common Object Request Broker Architecture)ベースのIIOP(Internet Inter-ORB Protocol)を規定した.OMGは数多くのベンダーが話し合いで規格を決めているオープンなものだが,オープンなものはなかなかモノができないという欠点がある.一方,Microsoftはさっさと独自規格のDCOM(Distributed Component Object Model)を,Windows NT 4.0と同時に提供しはじめた.DCOMはOLEベースの分散オブジェクト技術で,実装はあくまでもMicrosoft独自である.MTS(Microsoft Transaction Server)などのトランザクションを可能にするサーバーや,Visual Basic 5.0などのツールを使えば,比較的簡単に分散オブジェクトを実装することができる.
 いつもは,あくまでも独自に少々調子悪いものを作るが,それをいち早く提供してデファクトスタンダードにするMicrosoftに他のベンダーはやられてしまうが,今回は少々違っている.Oracleは,あくまでもオープンをベースにしているが,適材適所にMicrosoftのやり方も取り入れている.つまり,CORBA準拠の方法を取りながらも,DCOMともコンパチビリティーを持たせ,Oracle独自のプロトコルも実装してきた.それが,今回紹介する2つの製品である.
 ここでは,Oracleの分散オブジェクト環境NCA構想を担う2製品,Developer/2000 R1.5 Serverと,Web Application Server R3.0を紹介することにしよう.


Developer/2000 R1.5 Server
―― HTTPと別セッションで通信するJavaベースのソリューション

Developer/2000 R1.5は,Oracle独自のプロトコルを使った分散オブジェクト環境を構築するためのツールであり,従来のC/Sシステムを構築することも可能な柔軟性を持っている.

C/S時代を活躍してきたD/2000ファミリー

実は,Developer/2000は元々がC/S用のクライアントツールなのである.その起源を遡れば,UNIX用のCDE(Cooperative Development Environment) Toolsという製品に行き当たる.
 従来のDeveloper/2000は,次の3つの製品を統合したものであった.

さらにDeveloper/2000には,Designer/2000という兄弟ツールがある.これは,計画,分析,設計,構築といったシステム開発ライフサイクルを管理するもので,モデリングの機能を備え,Developer/2000などのソースコードを出力したり,逆にリバースエンジニアリングをしたりすることができる.Developer/2000とDesigner/2000を組み合わせて使うと,システム構築に強力なパワーを発揮するのである.
 Developer/2000は,GUIベースでの開発ができるツールだが,スクリプトはPL/SQLが使われる.面白いのは,クライアントサイドで作成したPL/SQLプロシージャの動作を確認したら,ドラッグ&ドロップでサーバー側のストアードプロシージャにすることができる点だ.
 このことに象徴されるように,Developer/2000は,Visual Basicなどの一般的な汎用ツールと比較すると,かなり特殊であり,APIの利用やActiveXコントロールの利用などの細かい制御には向かない.しかし,Oracle Serverへのアクセスを中心とした処理を目標にするのであれば,非常に効率よく開発をすることができる.
 PCへのダウンサイジングが叫ばれた時期,実際にはマトモに使えるツールがほとんどなかったときにも,Developer/2000(CDE Tools)は,(一般的な知名度はともかくとして)実際にはかなりいろいろなところで使われてきたツールでなのである.

Formsでのアプリケーションの作成

 Developer/2000のうち,入出力フォームなどを作るためのFormsの例を示そう.
 Formsは,デザイナ,ジェネレータ,ランタイムの3つのモジュールからなる.

このように,Developer/2000を使うと,非常に簡単に高度なクライアントアプリケーションを作成することができる.ここまでは,従来からDeveloper/2000の持っていた機能である.次に,R1.5から増えた,Webアプリケーションのしくみを説明していこう.

Developer/2000 for the Webのしくみ

 C/SシステムでのDeveloper/2000の動作は,図2のように表わすことができる.

図2:従来のクライアント/サーバーシステム

 これは,RDBMSサーバーにあるデータに対して,SQL*Net経由でクライアントアプリケーションがアクセスするものだ.ここで,クライアントアプリケーションにはさまざまな役割があることに注目してほしい.つまり,次の3つの部分である.

これを,Webアプリケーションにすることを考えてみよう.もちろん,Javaアプレットとしてこれらすべての部分をクライアント側に持ってくることも可能である.しかし,それだとクライアント側にかなり大きな負荷がかかることになる.加えて,SQL*Netがクライアント側にインストールされているという前提でないと,アプリケーションは動作しない.したがって,このまますべてのしくみをクライアント側に持ってくることは,Thinクライアントという視点からも現実的ではない.
 この手のn階層システムでは,クライアントをユーザーインターフェイスのみにするというのが,常套手段である.そこで,Oracleでは,ユーザーインターフェイス部分のみをJavaアプレットとしてダウンロードされるようにし,アプリケーションロジック部分とData ManagerとPL/SQLエンジンは,Developer/2000 Serverと呼ばれるサーバーで処理をさせることにした.これらには,Forms(図3),Graphics,Reportsの各サーバーがある.これならば,クライアント側の画面はそのままで,C/Sのクライアントアプリケーションと同じように柔軟な動作をさせることができる.

図3:Developer/2000 for the WebではFormsサーバーを経由してRDBMSにアクセスする

しかも,通常のC/Sで使われるfmxファイルを自動的に分析して,ユーザーインターフェイスだけがJavaアプレットとして注目してほしい.つまり,これが“Developer/2000 for the Web”というコード名で呼ばれていた機能で,OracleはDeveloper/2000 Serverという製品を追加した.従来パッケージのDeveloper/2000にも,Serverと同じモジュールが含まれているが,これはテスト用である.実際には,Serverはライセンスを含めた実行環境なのである.
 Formsを使ったときの動作について,順番にさらに詳しく説明しよう(図4).

  1. クライアントマシンからWebサーバーに,URLが指定されてリクエストがくる
  2. WebサーバーのFormsカートリッジハンドラから,HTMLおよび .fmxファイルを元にしたユーザーインターフェイスJavaアプレットがクライアントに送付
  3. クライアントにJavaアプレットがダウンロードされ,実行が開始される.このとき,Formsサーバーに接続して,必要なリクエストを行う
  4. Formsサーバーリスナーはランタイムエンジンに対して,リクエストに応じたクエリーを計画する
  5. Oracle Serverに対してクエリーの実行
  6. クエリーの結果をクライアントに送付

図4:Developer/2000 Serverでのアクセス

Formsサーバーは実際には次の2つのコンポーネントからなっている.

Webアプリケーションとするには

では,実際にはどのような手順でこのようなWebアプリケーションとすることができるのだろうか.これは,簡単なようで少々ややこしいところがある.ここではFormsを例にとり,その方法を示すことにしよう.

Formsサーバーリスナーの起動

次に,Formsサーバーリスナーを起動する.これには特に注意すべきことはない.これはサービスではないので,スタートメニューから選んで起動すればよい.起動しても,ウィンドウとしては何も表示されないので,タスクマネージャなどを起動して動作を確認する必要がある.終了するインターフェイスも持っていないので,やはりタスクマネージャから終了させる必要がある.

アプレットの実行

ここまで設定できたら,いよいよ実行してみよう.実行するのはもちろんクライアントマシンである.このマシンにはOracle製品がまったく入っていなくてもかまわない.まさにThinクライアントである.Javaが実行できるブラウザがあればよいだけである.
 注意しなくてはならないのは,Developer/2000 Serverから送り込まれるJavaアプレットは,JDK 1.1.1相当のものである.したがって,もっとも確実に動作させるためには,Developer/2000に附属しているJDK 1.1.1をインストールし,その中のApplet Viewerをコマンドプロンプトから起動することだ.このとき,引数として次のようにURLを指定する.

少々時間がかかるが,アプレットがダウンロードされ,実行が開始される(画面4).このときの画面はほぼC/S用として作成したDeveloper/2000の画面と同じである.違っているのは,クエリーをしたときにもURLが変わらないことだ.Webブラウザはアプリケーションを実行するためだけのもので,その後のサーバーとの通信は,まったく別セッションで行われるのだ.

画面4:Formsで作成したアプリケーションをWeb経由で実行する

このようにして,サーバーと通信が始まると,サーバー側ではクライアントに対応するF45WEB32.EXEが起動される.これは,ユーザーインターフェイス以外のデータベースとの接続やアプリケーションルールを行う部分なのである.

先に紹介したように,Forms以外のReportsでも,少々構成は異なるものの,このようなn階層システムに対応している.
 Webベースでは,印刷は大きな問題だ.Webブラウザからサーバー側に印刷をさせてしまうのは不可能ではないが,離れたサーバーに接続されたプリンタに印刷されるのは無意味である.そこで,HTMLやAdobe Acrobat ReaderのPDF形式の印刷イメージをクライアントに送らせて,Webブラウザから,クライアントマシンに設定してあるプリンタに印刷させてしまおうというのだ.

Develoer/2000 for the Webは新しいWebソリューションとなるのか

駆け足でDeveloper/2000 Serverの機能を説明してきた.といっても,これはまったく簡単な部分だけを説明したに過ぎない.実際のDeveloper/2000にはPL/SQLを駆使した高度なプログラミング機能や,さらにDesigner/2000と組み合わせたときに初めて発揮されるエンタープライズソリューションに適したパワーもある.
 今回は,Webアプリケーションシステムを構築する上でのひとつのソリューションという観点から見たので,ほんの一部の機能しか紹介できなかった.また,私自身も納得行くまで調査する時間がなかったのは残念である.ざっと使った印象からではあるが,次に新しいDeveloper/2000の長所と短所をまとめてみた.

 このように,Developer/2000 R1.5の提供するソリューションは,現実的運用を考えると,まだまだ完全ではない.しかし,環境さえ整ってくれば,十分に使えるものである.何よりも複雑な設定や設計をしなおさなくても,C/Sそのままの設計(もちろん先に述べたようなトリガーは意識しなくてはならない)で,このような高度なWebアプリケーションを構築できることは大きな魅力である.
 後は,このメカニズムをWeb Serverとは分散させて複数のFormsサーバーを実行できるようにすることができれば,Oracleはさらに一歩先に進むことができるだろう.


Web Application Server R3.0 Advance Edition
―― CORBAベースでトランザクション可能なWeb Application Server

 Oracleは,もう2年ほど前からOracle Web Serverを発売している.もちろん,OracleらしくOracle7 Serverに接続してクエリーが可能という,RDBMS指向のインターフェイスが装備されたものだ.
 このたびリリースされたWeb Serverは,その名もWeb Application Server(以下,WAS)3.0となり,HTTPでは実現できなかったセッションの継続やトランザクションが可能となった.しかも,CORBAベースとなっているという.
 ここでは,このWASについてレポートしよう.

WAS 3.0に要求されたもの

 インターネット,イントラネットともに,Webを使ったソリューションが注目されている.単なるHTMLではなく,RDBMSとの連携を図り,さまざまな業務に対応させていこうというものである.この方法は,OSアーキテクチャーに依存しないThinクライアントを実現できるため,メンテナンスの管理がラクになり,コストを低減することができる.
 現実にこのようなシステムは数多く実働していることは,ご存じの通りである.しかし,従来のシステムはCGI(Common Gateway Interface)ベースのものがほとんどだった.CGIはリクエストされたURLがHTMLファイルではなく,プログラムである.プログラムがHTML文を動的に作成する.
 しかし,CGIはリクエストに応じてプロセスを起動するため,サーバー側にかなりの負担がかかり,速度も高速ではない.
 そのため,NetscapeではNSAPI,MicrosoftではISAPIといったCGI相当のAPIを提供することになった.これは,CGIの代わりにDLLを使うもので,あらかじめライブラリとしてモジュールがロードされているので,プロセスがあらためて起動されることはないため,高速に動作する.
 だが,もっとも問題なのは,ステートレスなHTTPに依存している従来のWebシステムでは,セッションの継続が困難であり,トランザクション処理をすることができなかったことだ.これでは,すべての業務をWebベースに移行することはできない.
 これを解決するためには,HTTPをあきらめて,別セッションで通信をさせるという方向性が考えられた.先に説明したDeveloper/2000でのやり方がこれである.しかし,この方法では,クライアント側に別セッションで通信処理をするJavaアプレットなどのプログラムがダウンロードされる必要がある.このため,クライアント側での動作はどうしてもダウンロードの分遅くなるし,Javaのバージョンにも依存する.そもそもが,現状のJavaはブラウザによって,あるいはプラットホームによって動作がかなり異なることからも,汎用なソリューションとは言い難い部分が残っている.
 Oracleでは,従来のOWS(Oracle Web Server) R2.1以前でも,セッションの継続をするしくみとしてCookieをサポートしてきた.しかし,CookieとはNetscapeの独自規格で,ブラウザ側の仕様だ.サーバーでCookieをサポートというのもヘンな話であると感じられるかもしれない.通常のHTTPD(Webサーバー)では,HTML,SSI(Server Side Include, HTML中に埋め込まれたコマンドをサーバーが処理する),CGIをサポートしており,Cookieは主にCGIを使って制御するものだからだ.
 実は,OWSではこういった通常のしくみのWebサーバーではなかった.WRB(Web Request Borker)と呼ばれる機能があり,共通のAPIを装備している.そのAPIレベルでCookieがサポートされているのである.カートリッジと呼ばれるインプロセスモジュールからこのAPIをコールすることができるのである.カートリッジにはPL/SQLやJavaなどがあり,それぞれの言語でサーバーサイドのプログラミングをすることができる.
 WAS 3.0では,これらのWebサーバー部分と,アプリケーションサーバー部分を分散して配置することが可能になっている.この分散のしくみのベースとなっているのがCORBA 2.0準拠のORBなのである.
 ただし,このCORBAベースの機能を持つのは,単体製品として出荷されるAdvance Editionのみとなる.

WRBの動作

 次に,WRBのメカニズムを説明しておこう.図5は,WAS 3.0でのWRBの動きを説明したものだ.

図5:WAS 3.0では,クライアント側からリスナーの他に,Dispatcherが適切に
  インスタンスを判断しながらWRBにインスタンシングを依頼する

 ここで注目してほしいのは,このインスタンスの作り方である.NSAPIやISAPIなどでは,インプロセスで動作するため高速であると述べたが,一方ではインプロセスではそこから起動されるサーバー側アプリケーションが万が一不正な処理をしたとき,サーバーごと落ちてしまうという問題がある.ところが,WASではこのようにWebサーバーとWRBを分散し,さらにカートリッジごとにプロセスを起動する方法を取っているため,最悪でも1つのカートリッジが死ぬだけで済む.

WASの特徴

 以上の知識を前提として,次に,WASの仕様の特徴を示す.

アドミニストレーター用環境とDADの設定

 WASのインストールは,ここまでのことを理解していれば,さほど難しいことはない.ただし,WASの環境設定などは,アドミニストレーターモードでWebブラウザを通して行う必要がある.これは通常のボート80以外のポート(デフォルトでは8888)を使ってアクセスする.つまり,HTTPDは2つ起動する必要がある.アドミニストレーターモードでアクセスするためのポートやパスワードなどをインストール時に指定する必要がある.
 インストールが終了したら,アドミニストレータとしてWebサーバーに接続し,データベースへの接続を指定し,DAD(Data Access Descriptor)の設定をする.つまり,Oracle7または8 Serverへの接続の指定をするのだ.ここで使用できるOracle Serverは,7.2.2以降に対応している.ただし,Workgroup Serverではトランザクションをサポートしない.また,Oracle8使用時は,SIDを指定しての直接接続はできず,必ずSQL*Netを経由しての接続となる.ここでは,Oracle 8 Server Enterprise Editionに接続してテストした.

 指定を完了して実行すると,Oracle Serverに接続し,サンプルのデータベースなどがインストールされる.この間,20分以上の時間がかかるのだが,ブラウザのStopボタンを押しても当然のことながら作業は継続されてしまうので注意が必要だ.
 DADの設定は,もちろん後から修正することもできる.仮想ディレクトリなどの詳細な設定も,同様にWebのアドミニストレータのページから実行することができる.
 ただし,これらの設定は内部的には単なるテキストファイルに書き込まれるだけのようである.慣れてくれば,テキストファイルの中身を直接書き換えて,HTTPDを再起動した方が早いかもしれない.
 DADの設定が終わったら,正常にインストールされているかを確かめてみるため,サンプルプログラムを動かしてみる.PL/SQLを使ったサンプルなどで,Oracle Server内のテーブルの中身を見ることができればOKだ.

カートリッジとは

 サンプルプログラムページでは,実行だけでなく,そのソースコードを見ることもできる.このソースコードは,PL/SQLやJavaなどで記述されている.前にも述べた,カートリッジを使ってサーバーサイドのプログラミングすることができるというのは,このことである.
 つまり,WRBには基本的なWRB APIセットがあり,そのAPIセットを呼び出す言語エンジンが複数用意されており,これをカートリッジと呼んでいるのである.APIセットをうまく使えば,Cベースでのアプリケーションが作れるほか,独自のカートリッジも作成することができる.
WAS3.0には,次の7つのカートリッジが付属している.

 誤解のないように断っておくと,ここでいうJavaカートリッジで作成するアプリケーションは,基本的にサーバーサイドのものである.つまり,Javaアプレットを作るわけではない.たとえば,「Hello World. Hello World.」と表示するためだけのコードをJavaで書くこともできるわけだ.実際にそのコードをLIST2に示す.

LIST2:Javaカートリッジのコード例

class HelloWorld {
  public static void main(String args[]) {
    System.out.println("Content-type: text/html\n\n");
    System.out.println("Hello World.\n");
    System.out.println("Hello World.\n");
  }
}
 

 CGIを書いたことがあればわかるが,これはまさにCGIを書くのと内容的には同じなのである.つまり,言語がJavaになっているに過ぎないのだ.
 もちろん,こんな単純なことをするならばHTMLだけ書けば済む.しかし,PL/SQLやJavaを使って,RDBMSへのアクセスを記述することができるのは大きなメリットだ.従来のようにさまざまなサードパーティのライブラリや,複数の言語(少なくともHTMLとCGI用の2つ以上)を使って開発していたこの手の開発が,1つの言語だけで可能になるという点は評価すべき点であろう.

トランザクションの実現

 WAS 3.0でもっとも注目すべきは,トランザクション処理が可能になったことだろう.ただし,WAS 3.0での方法は,今まで私たちがDCOMやIIOPといったもので描いていた「別セッションでの通信」で実現されているわけではなさそうだ.
 つまり,WASではあくまでもステートレスなWebサーバーをベースとしながらも,アプリケーションサーバー内部で,複数のURLに対応したトランザクションの範囲を設定するという方式なのである.
 実際には,トランザクションを使用するカートリッジのコンフィギュレーションで,TRANSACTIONSサービスを選択できる.トランザクションを行うには,この設定をしておく必要がある.また,同時にORBプロトコルも選択できる.
 さらに,トランザクションの設定ページを開いて,トランザクションに関する情報をWASに設定する.

 このように,トランザクションに関連する一連のURLを指定することができる.
 残念ながら,トランザクションを実現するサンプルは附属していなかった(少なくともカートリッジにそのような設定がされているものはなかった).また,今回はあまり時間がなかったこともあり,独自にサンプルを作ることができなかったため,この機能を詳細にテストすることはできなかった.
 このようにURLごとにトランザクションの各処理に分ける考え方は,MicrosoftのTransaction Serverのオブジェクトごとに設定できるものと,ある意味でよく似ている.サーバーサイドでのトランザクション管理は,今後このような比較的容易に設定できる方向にいくのかもしれない.

WASはWebベースのRDBMSシステムを変えるか

 駆け足でWASについて解説してきたが,もっともっとたくさんのトピックがある.たとえば,トランザクションなどの新しいWRB APIセットが追加されたことや,WRB APIの仕様変更などもある.
 今回レポートに使ったWASは,当初はUS版,その後日本語版の製品版相当のもので,マニュアルがなかったこともあって,設定には意外に苦闘してしまった.また,Oracle8やDeveloper/2000 Serverなど新しいものと組み合わせたこともあり,バージョンの問題などさまざまな困難があり,思ったより時間がとれなかったのは残念だった.
 WASは,PL/SQLやJava,さらには既存のCGIをうまく活かすことのできるPerlカートリッジなども装備しており,さらにICXにより別カートリッジとの通信も可能である.これは非常に柔軟性の高いシステムと言えるだろう.さらに,トランザクションをこのような形,ある意味でコロンブスの卵的な解決法で実現したのも興味深い.
 少々残念だったのは,CORBAがHTTPDから先に使われており,クライアントとHTTP以外で通信するタイプの分散環境は構築できないことだ.これを高レベルにしかも簡単な設定でこれを実現しているのがDeveloper/2000 Serverであるが,それだけに制限事項もあるのは前に述べたとおりである.私は個人的には,より汎用的な分散オブジェクト環境を構築できるサーバーあるいはツールが必要だと感じる.HTTPDと組み合わせて使うこともできるからだ.今後Oracleがこのような製品を作ってくれることを期待したい.


VB Magazine ライブラリ | Visual Basicコースホームページ
int21 ホームページ | PCDN ホームページ


Copyright (c) 1997 int21 Corporation All Rights Reserved.
For questions or comments, please send mail to: pcdn@int21.co.jp