接続プール

1 台のコンピュータ上で、または専用の並列配置セットアップの場合でも複数の仮想ホストを実行する場合は、要求数の急激な増加に備える必要があります。数十個、数百個、または数千個の要求が同時に 1 つのサイトで発生すると、設計が不適切なアプリケーションではすぐに対応できなくなります。

データベース接続を作成すると、特に厄介なボトルネックになる可能性があり、最も負荷の大きいデータベース操作の 1 つは初期接続の確立です。使用しているデータベースによっては、プロトコル ハンドシェークの実行、ユーザ情報の確認、ディスク ファイルのオープン、またはメモリ キャッシュの作成が接続に必要となる場合があります。標準的なサーブレットや JSP では、エンド ユーザがこの接続のためのパフォーマンス コストを負担することになります。

プールを使用しない場合は、サーバによって、新規ユーザごとに新しい接続が生成されます。

帯域幅を使用する上でピーク負荷を処理する方法の 1 つは、ある種のデータベース接続プールを実装することです。JRun はこのために簡単なメカニズムを提供しています。

接続プールとは

接続にかかる時間を短縮することはできませんが、ユーザの使用に備えて事前に接続のコレクション (プール) を設定しておくことが可能です。別個のスレッドでこれらの接続を設定することによって、サーブレットのパフォーマンスの低下を最小限に抑えることができます。サーブレットはプールから接続を取得し、それを使用し、完了後に返します。

これまで、多くの開発者は、独自の接続プールを開発するか、または、市販の接続プールを利用してきました。JRun 製品には強力な接続プールがバンドルされているため、接続プールの開発という作業が不要になりました。接続プールは JMC で簡単に管理できます。

接続プールを使用する理由

接続プールによってパフォーマンスが大幅に向上します。その他にも多数の利点があります。これらの利点については、次の表で説明します。
利点
説明
拡張性
サーブレットの全体的なパフォーマンスが向上することにより、アプリケーション全体の拡張性も大幅に向上します。
コードの再利用および
削減
接続プールを使用すると、記述して維持するコードの量を減らすことができ、また、すでにテストおよび動作確認が行われたコードを再利用できます。
集中管理
サーブレットを変更したり再コンパイルせずに、接続パラメータ (ユーザ名、パスワード、カスタム引数など) を 1 か所で変更できます。
セキュリティ
接続を使用するときにサーブレットに必要なのはデータ ソース名のみなので、データベースのユーザ名とパスワードが公表されることはありません。
パフォーマンス
パフォーマンスの向上は、サーブレットがデータベースを使用する場合の最も注目すべき最大のメリットの 1 つです。

接続プールの使用

JRun 接続プール メカニズムを使用できるのは、JMC でセットアップされた JDBC データ ソースとともに使用する場合だけです。JDBC の作成方法の詳細は、『JRun によるアプリケーションの開発』を参照してください。[JDBC データ ソース] パネルの使用方法については、『JRun セットアップ ガイド』を参照してください。

使用しているデータベース ドライバに独自のネイティブ接続プール メカニズムが含まれている場合は、パフォーマンスを最適化するために、JMC 内の JRun 接続プールをオフにします。

JDBC 接続プールの起動

このセクションでは、接続プール メカニズムをオンにする方法について説明します。

JDBC 接続プールを起動するには

  1. JRun 管理コンソールを開きます。
  2. [マシン名] > [JRun サーバ名] > [JDBC データ ソース] を選択します。

    [JDBC データ ソース] パネルが表示されます。

  3. データ ソースの名前をクリックします。

    JDBC データ ソースの編集ウィンドウが表示されます。

  4. [プール] チェック ボックスをオンにして、この JRun サーバについて、JRun の接続プール メカニズムをオンにします。
  5. JRun サーバを再起動します。

プールを使用するには、データ ソースについてプールを明示的に有効にする必要があります。既定では、プールは使用可能になっていません。実際の JDBC データベース接続のエイリアスを作成すると、プール機能のない JRun データ ソースでもサーブレットで使用できます。

接続プール プロセス

次に、接続プール プロセスの手順について説明します。

  1. JNDI InitialContext が作成されます。JNDI InitialContext は、名前を指定したルックアップの実行に使用するコンテキストです。 JNDI によって、名前でオブジェクトをコンテキストにバインドできます。このようにして、JRun データ ソースにアクセスします。
  2. JDBC データ ソース オブジェクトが JNDI コンテキストから取り出されます。このオブジェクトは、JDBC 2.0 データ ソースの JRun 実装で、指定したデータ ソース名のプールにあるすべての接続を保持します。検索では、次の形式によるデータ ソース名が必要になります。
    java:comp/env/jdbc/{Data Source name}
    
  3. JDBC 接続がデータ ソースから取得されます。
  4. データベースは接続を介して操作されます。
  5. すべての操作は、"try/catch/finally" ブロックでラップされます。最終ブロックは、例外が送出された場合でも必ず実行されます。
  6. 最終ブロック内で接続を閉じます。これにより、接続は解放されてプールに戻されます。JDBC ステートメントまたは結果セットを開いたら、結果セット、ステートメント、および接続の順で閉じる必要があります。

データ ソースを介してプールから接続を要求する際に利用できる接続がない場合は、JRun によって新しい接続が作成されて返されます (プールの初期サイズ、つまりプール内の接続数はゼロであることに注意してください)。利用できる接続がある場合は、直ちにその接続が返されます。

接続を一度使用したら、それを閉じる必要があります。JRun では、接続を閉じる代わりにそれをプールに返す接続プロキシ オブジェクトが用意されています。プールは、指定されたデータ ソース名に対して、同時ユーザの数だけ大きくなります。接続がタイム アウトになるとプールは縮小します。

JSP を作成する場合は、JRun カスタム タグ ライブラリの使用を検討してください。このライブラリには、JRun データ ソースを使用する jrun:sql タグが含まれています。

接続プールの例

このセクションでは、サーブレット、EJB、および JSP での接続プールの使用方法について説明します。


メモ

JRun 接続プールを使用する前に、『JRun セットアップ ガイド』の説明に従って JRun で JDBC データ ソースをセットアップする必要があります。


JRun は、標準 API メカニズム、特に JNDI および JDBC 2.0 を介してプールを提供します。たとえば、次のサンプル コードでは、JRun JDBC データ ソースを使用したデータベース接続が確立されます。

import java.sql.*;
import javax.naming.*;
import javax.sql.*;
...
InitialContext context = null;
Connection con = null;
try {
    // JNDI コンテキストを取得します。
    context = new InitialContext();
      
    // データ ソースのルックアップを行います。
    DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/" + 
dsn);
        
    // データ ソースから接続を入手します。
    con = ds.getConnection();
    ...
}
catch (Exception ex) {
    throw new ServletException(ex.getMessage(), ex);
}
finally {
    if (con != null) {
        // 必ず接続を閉じます。
        try {
            con.close();
        }
        catch (SQLException ex) {
            // 閉じる際のエラーは無視します。
        }
    }
    if (context != null) {
        // 必ずコンテキストを閉じます。
        try {
            context.close();
        }
        catch (NamingException ex) {
            // 閉じる際のエラーは無視します。
        }
    }
}

JRun データ ソースを利用するには JDK 1.2 以降を使用する必要があります。これは、この機能が JNDI および JDBC 2.0 に依存しているためです。ただし、jndi.jar および jdbc.jar を JRun のクラスパスに追加することによって JDK 1.1.x も使用できるようになります。これらの jar ファイルは、JRun 3.0 とともに JRun のルート ディレクトリ/lib/ext ディレクトリにインストールされます。

EJB での接続プール

JRun 3.0 は、現在、データ ソースを指定するために 2 つの異なる場所を提供しています。1 つはサーブレットおよび JSP 用、もう 1 つは EJB 用です。EJB 内からデータ ソースを使用する場合は、EJB の deploy.properties ファイル内でデータ ソースを定義する必要があります。この方法の例については、『JRun サンプル ガイド』を参照してください。

JRun 接続プールを使用しない場合

使用している JDBC ドライバがすでに JDBC 2.0 接続プールをサポートしている場合、そのドライバには JRun 接続プール メカニズムを使用しないことをお勧めします。ドライバのベンダは、一般の接続プールよりも効率的で強力なデータベース専用の機能を採用しています。

また、サーブレット コンテナ間のサーブレット相互運用性について不安がある場合は、接続プールを使用しないことをお勧めします。JDBC データ ソースを取得するための JNDI メカニズムは J2EE 仕様の一部であるため、この機能を使用するサーブレットは J2EE 互換のサーブレット コンテナに移植可能になります。あいにく、一部のサーブレット コンテナではこの機能がサポートされていない場合があります。したがって、サーブレットで接続プールを使用する前に、サーブレットが公開されるサーバが JDBC データ ソースをサポートしていることを確認する必要があります。