
通常のJavaアプリと違い、Webアプリでは、JDBCで考慮する点が異なりますので、まとめておきます。
DBとのコネクションについて
DBとのコネクション(接続)は、通常のアプリでは、クライアントで保持したままになりますが、Webアプリでは、リクエストごとに接続しなおします。
なぜ、そうなっているのか?
同時接続数が多いため。
なぜ、リクエストごとに接続しなおすかというと、Webアプリの場合は、コネクションの数が有限だからです。
特に、Webアプリの場合は、規模にもよりますが、20も30もリクエストが「同時に」あることが当たり前ですから、すぐにコネクションが枯渇してしまいます。
HTTPは、ステートレスで状態を保持しないため。
HTTPでは、基本的に状態は保持しませんので、DBの接続状態に関しても同様に保持しません。セッションで、クライアントの接続状態を保持する仕組みがありますが、DBに関してまで決め細やかに、保持する仕組みはありません。
対策として、アプリケーションサーバ(Tomcat等)ーのコネクションプールを使う。
基本的にこうしたコネクションで、メモリ枯渇のためにWebアプリのパフォーマンスが悪くなることの対策のためにTomcat等のアプリケーションサーバーには、「コネクションプール」という仕組みがあります。
それなりの規模のWebアプリを開発する場合は、必ず導入するようにしましょう!
Tomcatのデータソース
Tomcat等で機能を提供する技術を「データソース」と呼んでいます。
「データソース」の中で、代表的な機能をいくつかご紹介します。
データソースのメリット
パフォーマンスやポータビリティが高い点。(小規模だとあまり実感はできない)
コネクションプール
DB接続の際に、リクエストごとに、コネクションを取得して、解放するというのは、コストがかかりますが、それを解決するための仕組みです。
いちいち、リクエストごとに新規でコネクションを接続しに行くのではなく、あらかじめ、コネクションをいくつかTomcat内で、プールしておき、その中から割り当てます。
コネクションを使い終わったら、プールに返します。
JNDI
JNDIとは、「Java Naming and Directory Interface」の略で、ネーミングサービス及び、ディレクトリサービスを提供します。
ネーミングサービス
Webアプリ内で、セッションに名前として値を登録しましたが、それをアプリケーションサーバーで登録しておき、使えるようにします。
ルックアップ
ネーミングサービスで、アプリケーションサーバーに登録されたオブジェクトを、検索して取り出すことです。lookup()というメソッドがあり、よく使われます。
ディレクトリサービス
「ネーミングサービス」と似ていますが、「ネーミングサービス」に比べて、構造が階層構造になっています。
ResultSetは別オブジェクトにつめなおすこと。
サーブレットで、DB検索して、ResultSetにデータを取得して、JSPで表示するというプログラムの場合の話です。
ResultSetは、コネクションを閉じると、同時に閉じられてしまいますので、サーブレットの処理が終わると、ResultSetをそのままJSPで使うことはできません。
なので、通常の場合は、ResultSetを一旦、JavaBeansのリストに詰め込んで、リクエストに入れて、JSPで取り出すという形になります。
O/Rマッパーを取り入れよう。
そもそも、SQL自体をちまちまJavaのプログラムで書いたり、JavaBeansに詰め替えたりするのは面倒じゃないですかね。相当高度なSQLを使うということでない限りは、O/Rマッパーを使った方が、いい場合が多いです。Webアプリの技術選定する際は、「O/Rマッパーの導入」も候補に入れましょう!
O/Rマッパーについては、下記の記事でも解説しています。
この記事へのコメントはありません。