Level 10
新しい level を提案し、実装し、測定せよ。
想定したアプリケーションには、本当にデータベースは必要だったのだろうか? 通常のテキストと全文検索システム程度で十分だったのでは?
PHPとServletの比較でも良い。
人工的なテストは、実際のアプリケーションの使われ方にそっているのだろうか? 複数のトランザクションを同時に処理するベンチマークを作るにはどうすれば良いのだろうか?
データベースをPCクラスタ上で高速化するにはどうした良いのだろうか?
ユーザインタフェースの適切さを評価するには、どうすれば良いか?
サーブレットの設定
今回、我々はtomcatを使用する事にした。オラクル9iの実行環境と同じ環境で動くものとして、バージョンは4.1.31を選択した。
tomcat.apache.orgから、バイナリをダウンロードし、ホーム上で展開して使用した。
tomcatは、デフォルトでポート8080が指定されている。pw008上では、他のプロセスとポート番号がぶつかってしまったので、8081にポート番号を変更する事にした。
tomcatの設定ファイルは、tomcat/conf内のserver.xmlに記述されている。server.xml上で、ポート番号の変更と、新しいディレクトリの定義を行った。これは、我々が使用するディレクトリを、ネット上で公開するために必要な設定である。tomcatは、server.xml上で指定したディレクトリのみのアクセスを許可する。
webapps以下に、server.xmlで設定したnakadenと、nakaden/WEB-INF、nakaden/WEB-INF/classes、nakaden/WEB-INF/libを手動で作成する。classesは、ウェブ上で実際に動作するサーブレットクラスを格納する。しかし、これもclassを置くだけではなく、nakaden/web.xmlを作成して、明示的に記述しなければ、アクセスできない。もう一つの方法として、conf/web.xmlにて、サーブレットのマッピングをどのように行うか、設定できる。我々は、後者を選択し、実験を行った。記述した内容は以下の通りである。
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>ウェブ上では、nakaden/WEB-INF以下のディレクトリは見えないので、これにより、WEB-INF/classes/listといったサーブレットを実行する時は、http://pw008.st.ie.u-ryukyu.ac.jp:8081/nakaden/servlet/listといったURLで実行する事が可能である。
nakaden検索システム
プログラム構成は、MVCプログラミングに基づくように設計した。モデル部分が、Oracle_model.java、Config.java、ビューア部分がhtml_View.java、コントロール部分を、System_Controller.java、list.javaが担当している。
GETが要求されたとき POSTが要求されたとき データベースへのコネクションは、Oracleで起動しているリスナーを経由して、Oracle JDBC OracleDriverを経由して行う。一般的に、OracleDriverはjavaのライブラリに存在しないものである。使用するにあたって、/u01/app/oracle/product/10.2/jdbc/lib/classes12.jarへのパスを通す。それにより、実行可能になる。
Class.forName("oracle.jdbc.driver.OracleDriver");これは、見てもわかる通り、実行時にドライバを検索し、ロードする。実行はサーブレット上で行うので、環境変数のCLASSPATHは読み込んでくれない。
この問題を解決するためには、サーブレット上のディレクトリ、WEB-INF/lib/にjarファイルを置く事により、実行時にロードする事が可能になる。
しかし、このままコンパイルして実行しても文字化けが発生する。
javac -encoding shift_jis といった具合にエンコーディングを指定しないと文字化けする。一般的に、コマンドライン上での実行においては、各々のjavaソースにおいて、文字コードが異なっていても文字化けする事は無い。原因として考えられるのは、servlet上のバーチャルマシンは、j2seのバーチャルマシンの動作が微妙に異なると思われる。明示的にエンコーディングを指定しなければ、化けてしまう。比較する
中村電機PHPバージョン
中村電機サーブレットバージョン System_ControllerにSystem.currentTimeMillis();を用いて、開始時と終了時を獲得して、検索結果の一番下に出力するようにした。phpバージョンは平均、114ms、サーブレット504ms。かなりの差が見られる。原因として、リスナーを経由している事が考えられる。
検索内容 検索件数 時間 商品名=S9000、AVデジカメ館 1件 229ms キーワード=北原愛子、CD・DVD館 12件 341msec キーワード=JAMProject、CD・DVD館 36件 523msec 商品名=VAIO、CD・DVD館 2件 212msec 商品名=KENWOOD、AVデジカメ館 2件 146msec 商品名=鉛筆、文具オフィス館 20件 412msec キーワード=ツインバード、家電 11件 1304msec 商品名=ベーカリー、家電 5件 307msec 商品名=眼鏡、家電 0件 1231msec 型番=FXZ1B,AVデジカメ館 4件 319msec 改善
少しでも早くするために、三層クライアント・サーバ型 データベース・システムを実装する。こうしようと思った理由は、サーブレットを立ち上げるにあたって、多くのjavaプロセスが立ち上がる。Oracleの起動だけでもメモリが足りてないので、WEBサーバを別にすることにより、ページングの量や、CPUの負荷軽減に繋がると考えた。
負 荷分散したNAKAMURASOBA
同じキーワードで検索した。速度にむらが出てきた。一回目以外のデータに関しては、速度が速くなっている。これはリスナーとの接続に時間がかかってしまうためだと思われる。2回目以降からの実行は高速に行える。 以上のようにサーブレットを用いてシステムの改良を実現した。
検索内容 検索件数 時間 商品名=S9000、AVデジカメ館 1件 21295ms キーワード=北原愛子、CD・DVD館 12件 271msec キーワード=JAMProject、CD・DVD館 36件 806msec 商品名=VAIO、パソコン館 2件 167msec 商品名=KENWOOD、AVデジカメ館 2件 89msec 商品名=鉛筆、文具オフィス館 20件 189msec キーワード=ツインバード、家電 11件 78msec 商品名=ベーカリー、家電 5件 133msec 商品名=眼鏡、家電 0件 76msec 型番=FXZ1B,AVデジカメ館 4件 68msec