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.javaConfig.java、ビューア部分がhtml_View.java、コントロール部分を、System_Controller.javalist.javaが担当している。
GETが要求されたときPOSTが要求されたとき
GETPOST

データベースへのコネクションは、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();を用いて、開始時と終了時を獲得して、検索結果の一番下に出力するようにした。
検索内容検索件数時間
商品名=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
phpバージョンは平均、114ms、サーブレット504ms。かなりの差が見られる。原因として、リスナーを経由している事が考えられる。

改善

少しでも早くするために、三層クライアント・サーバ型 データベース・システムを実装する。こうしようと思った理由は、サーブレットを立ち上げるにあたって、多くのjavaプロセスが立ち上がる。Oracleの起動だけでもメモリが足りてないので、WEBサーバを別にすることにより、ページングの量や、CPUの負荷軽減に繋がると考えた。

x3
負 荷分散したNAKAMURASOBA
同じキーワードで検索した。
検索内容検索件数時間
商品名=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
速度にむらが出てきた。一回目以外のデータに関しては、速度が速くなっている。これはリスナーとの接続に時間がかかってしまうためだと思われる。2回目以降からの実行は高速に行える。 以上のようにサーブレットを用いてシステムの改良を実現した。