DBコネクション・プール

 

 


 

 


サーブレットにおけるコネクション・プールとは

 

データベースはウェブ・アプリケーションの中核要素であり、多くのコンポネントやスレッドからアクセスされる。従ってデータベースのアクセスはなるべく短時間に済ませねばならない。アプリケーションが提供されるサービスのよしあしが、データベースのアクセス時間によって決まることも多い。与えられたデータベースとハードウエアのもとで、データベースへのアクセス時間を短縮するには、データベースの本来の仕事であるデータの検索や追加・変更以外にかかる作業を短縮しなければならない。それがSQLの構文解析及びコンパイルと、該DBへの接続である。

 

通常アプリケーションがデータベースをアクセスするとき、定型化された幾つかのSQL文をSQLサーバに送る。異なるのは、そのSQL文のパラメタのデータだけであろう。SQLで記されたクエリをデータベースが毎回解析/コンパイルするのではなく、そのようなSQL文をあらかじめ解析/コンパイルしてサーバにプールしておけば、時間短縮がはかれる。そのようなコンセプトで用意されているのが、java.sql.PreparedStatementインターフェイスである。これは今回のチュートリアルの対象ではないので、これ以上の説明は加えない。

 

データベースの接続は、TCP接続の確立といった下位層の接続と、これに続くユーザ認証などの手続きが含まれ、SQL文を送るたびにこれを行うのは現実的ではない。データベース接続の開放にあたっても同じように複雑な手順がアプリケーションから見えないところで踏まれている。従ってあらかじめ複数個の接続を用意しておき、プールされたその接続をアプリケーションがその都度使うのが一般的である。プールされた数以上の接続が必要になった場合には、新たな接続を用意するか、あるいはそのアプリケーションを待機させるかをする。

 

JDBC 2.0の標準の拡張API(javax.sql)では、このような仕組みが採用されている。javax.sqlのクラスとインターフェイスの階層は以下のようになっている。このうち、コネクション・プールに関するものは赤で示してある。

 

http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/sql/package-tree.html参照のこと

javax.sqlのクラス階層

class java.lang.Object

class java.util.EventObject (implements java.io.Serializable)

class javax.sql.ConnectionEvent

class javax.sql.RowSetEvent

javax.sqlのインターフェイス階層

interface javax.sql.ConnectionPoolDataSource

interface javax.sql.DataSource

interface java.util.EventListener

interface javax.sql.ConnectionEventListener

interface javax.sql.RowSetListener

interface javax.sql.PooledConnection

interface javax.sql.XAConnection

interface java.sql.ResultSet

interface javax.sql.RowSet

interface java.sql.ResultSetMetaData

interface javax.sql.RowSetMetaData

interface javax.sql.RowSetInternal

interface javax.sql.RowSetReader

interface javax.sql.RowSetWriter

interface javax.sql.XADataSource

 

DataSource(JDBC 2.0即ちjavax.sql.DataSource)インターフェイスまたはDriverManager (JDBC 1.0即ちjava.sql.DriverManager)インターフェイスを使うと物理的なconnectionオブジェクトを取得できる。論理的な(プールされた)接続を取得するには、次の二つのインターフェイスを使う。

-     javax.sql.ConnectionPoolDataSource: プールされたjava.sql.Connectionオブジェクトのファクトリとして機能する。各データベース(またはそのJDBCドライバ)のメーカがこれを実装してユーザに提供する(例えばOracleoracle.jdbc.pool.OracleConnectionPoolDataSourceクラスとして実装している)。

-      javax.sql.PooledConnection: データベースへの物理的な接続をカプセル化する。これもメーカが実装して提供する。XA (X/Open仕様)のこれと等価なインターフェイスがXAConnectionとして存在する。

 

なおjavax.sql.DataSourceインターフェイスは、java.sql.Connectionオブジェクトのファクトリで、PooledConnectionを実装したクラスを使うと(ベンダが提供していれば、Oracleの場合はoracle.jdbc.poolパッケージの OracleDataSourceクラス)、このインターフェイスのgetConnection()をコールすると、プールされたコネクションを取得できる。但しその前にConnectionPoolDataStoreオブジェクトを設定しておかねばならない。

 

これをイメージで示せば次のようになる。


 


つまりConnectionPoolDataSourceはプールされたDB接続の特性を与えるもので、通常このオブジェクトはJNDIに登録しておく。個々のDBコネクションはこのオブジェクトのgetPooledConnectionメソッドを呼ぶことで生成される。アプリケーションがこのオブジェクトを取得したいときはこのPooledConnectionオブジェクトのgetConnectionメソッドを呼ぶ。ベンダによってはDataSource型のPooledDataSourceオブジェクトが提供される。この場合はこのオブジェクトのgetConnectionメソッドを呼ぶとプールの中から使われていないDBコネクションが与えられる。

 

記述されるコードは次のようになろう。

http://developer.java.sun.com/developer/technicalArticles/J2EE/pooling/から

import java.sql.*;

import javax.sql.*;

// ベンダー提供のJDBCドライバをここでインポートする

 

public ProductPK ejbCreate() {

  try {

// JNDIルックアップパラメタの初期化

  Context ctx = new InitialContext(

    parms);

...

  ConnectionPoolDataSource cpds =

  (ConnectionPoolDataSource)ctx.lookup(

    cpsource);

 

...

// 以下のパラメタはJNDI ルックアップで与えられる

  cpds.setDatabaseName("PTDB");

  cpds.setUserIF("XYZ");

...

  PooledConnection pc =

    cpds.getPooledConnection();

  Connection conn = pc.getConnection(); //コネクションの取得

...

// ここでビジネスロジックを実行する

  conn.close();  //コネクションを戻す

  }

...

}

注:実際のコードはデータベースやそのドライバのベンダの実装によって異なってくる

 

ベンダによってはコネクションプーリングを実装したDataSource型が提供される。この場合は

ds = (DataSource)ctx.lookup("jdbc/fastCoffeeDB");

などのようにJNDIに登録されているDataSource型のオブジェクトを探し出して、このオブジェクトdsをつかって次のようにコネクションの取得と返却を行う。

try {

   Connection con = ds.getConnection(

                            "myLogin",

                            "myPassword");

   // . . . プールされたコネクションを使ったビジネスロジックのコード

 

  } catch (Exception ex {

   // . . . 例外処理のコード

  } finally {

 

   if(con != null) con.close();

  }

 

 

参考資料: http://developer.java.sun.com/developer/Books/JDBCTutorial/ 

 

 

前節     目次     次節