8.JNDIのデータベースコネクションプールを使用したJava Webアプリケーション
先ほど作成したApache Moduleと同じように、データベースから値を取得して画面表示を行うようにしましょう。コードの説明、コンパイル、Tomcatへのデプロイは各所で紹介されていると思いますので省略し、ここではディレクトリ構成のみを記載します。
なお、PostgreSQLのJDBCドライバはこちらから入手して下さい。
- P5\test\WEB-INF\src\HelloWorldServlet.java
- P5\test\WEB-INF\web.xml
- P5\server.xml
$TOMCAT_HOME/ |_conf | |_server.xml | |_lib | |_postgresql-8.2-506.jdbc2.jar | |_postgresql-8.2-506.jdbc2ee.jar | |_postgresql-8.2-506.jdbc3.jar | |_webapps |_test |_WEB-INF |_classes | |_HelloWorldServlet.class |_lib |_web.xml
Tomcatを起動してブラウザからURL 「http://(ホストIPアドレス):8080/test/servlet/myservlet」にアクセスすると次のような画面になります。
9.Apacheモジュールと Java Webアプリケーションの性能比較
ApacheモジュールとJavaそれぞれのWebアプリケーションが準備できました。早速処理速度の比較を行ってみましょう。比較にはApache Bench(以下、AB)を使用します。
Apache HTTP ServerとTomcatを起動させたら、まずローカルホスト上でABコマンドを10回実行します。これは各アプリケーションをキャッシュに乗せ、安定した状態を作り出すためです。
準備が整ったら計測を開始しましょう。処理内容は「データベースから50件のデータを取得して表示する」こととします。計測に用いるコマンドは以下のとおりです(参考:「ab - Apache HTTP server benchmarking tool」)。
対象サーバ | コマンド |
Apache HTTP Server用 | ab -n 100 -c 10 http://localhost/test |
Tomcat用 | ab -n 100 -c 10 http://localhost:8080/test/servlet/myservlet |
ABコマンド実行後に表示される項目から計測結果をチェックします。「Requests per second」が処理速度の比較結果をあらわします。また、「Failed requests」の値からレスポンスに異常が発生していないこともチェックしておきましょう。
筆者が行った計測の結果は以下のとおりでした。
モジュール | Requests per second | Write errors |
Apacheモジュール | 272.43 | 0 |
Java Webアプリケーション | 229.56 | 0 |
Apacheモジュールの方がJava Webアプリケーションよりも1秒間あたり43リクエスト分多く処理できています。比率にすれば約1.2倍の処理速度です。今回の計測がデータベースから文字データを取得して表示するだけの処理であることを考えれば、この数値は意外と大きいのではないかと感じます。Javaに不利な処理などが入るともっと違った結果がでるのかもしれません。
条件面では、C言語ではテンプレートエンジンClearSilverを使用したので、JavaにはJSPを使用しても良かったかなと思います。より実践的な比較を考えるならば、JavaではStruts2を使ってみるのも面白いかもしれません。