パッケージjavax.sql
java.sql
パッケージを補足するもので、バージョン1.4リリースの時点ではJava Platform, Standard Edition (Java SE)に含まれています。 これは、JavaプラットフォームであるEnterprise Edition (Java EE)の重要な部分のままです。
javax.sql
パッケージは、次のものを提供します。
- データ・ソースとの接続を確立するための、
DriverManager
の代替となるDataSource
インタフェース - 接続プールと文のプール
- 分散トランザクション
- 行セット
アプリケーションではDataSource
とRowSet
を直接使用しますが、接続プールAPIと分散トランザクションAPIは中間層インフラストラクチャによって内部的に使用されます。
DataSource
オブジェクトを使用した接続の確立
javax.sql
パッケージでは、データ・ソースとの接続を確立するための最適な方法を提供しています。 元のメカニズムであるDriverManager
クラスも依然として有効であり、このクラスを使用したコードも引き続き実行できます。 ただし、DriverManager
メカニズムよりも多くの利点があるため、新しいDataSource
メカニズムを使用することをお薦めします。
接続を確立する際にDataSource
を使用する主な利点を挙げます。
- データ・ソースのプロパティに変更を加えることができます。つまり、データ・ソースやドライバに関する変更があったときに、アプリケーション・コードを変更する必要がありません。
- 接続と文のプールと分散トランザクションは、中間層インフラストラクチャで動作するように実装された
DataSource
オブジェクトを介して利用できます。DriverManager
を介して確立された接続には、接続プール、文のプール、分散トランザクションなどの機能がありません。
ドライバのベンダーはDataSource
の実装を提供します。 特定のDataSource
オブジェクトは、特定の物理データ・ソースを表します。DataSource
オブジェクトが作成する各接続は、その物理データ・ソースへの接続になります。
データ・ソースの論理名は、通常はシステム管理者またはシステム管理者の職務を実行するユーザーによって、Java Naming and Directory Interface (JNDI) APIを使用するネーミング・サービスに登録されます。 アプリケーションでは、登録されている論理名を検索して、必要なDataSource
オブジェクトを取得します。 そして、取得したDataSource
オブジェクトを使用して、このオブジェクトが表す物理データ・ソースへの接続を作成します。
DataSource
オブジェクトが作成した接続をプールし、再利用するため、このオブジェクトを、中間層インフラストラクチャと連携して動作するように実装することができます。 このようなDataSource
実装を使用するアプリケーションは、自動的に、接続プールにある接続を取得します。 DataSource
オブジェクトが作成した接続を、特別なコーディングをしないで分散トランザクションで使用したい場合も、このオブジェクトを、中間インフラストラクチャと連携して動作するように実装します。
接続プールと文のプール
中間層接続プール管理プログラムで動作するように実装されたDataSource
オブジェクトによって作成された接続は、接続プールに追加されます。 新しい接続の作成は非常に負荷が大きい作業であるため、これによりパフォーマンスが飛躍的に向上します。 接続プールでは、接続の利用および再利用が可能です。そのため、作成する必要のある新規接続の数は大幅に削減されます。
接続プールは完全に透過的です。 Java EEの構成の中間層で自動的に行われ、アプリケーションの観点からは、コードを変更する必要はありません。 アプリケーションでは単にDataSource.getConnection
メソッドを使用してプールされた接続を取得し、Connection
オブジェクトを使用するのと同じ方法で使用します。
接続プールに使用されるクラスとインタフェースは次のとおりです。
ConnectionPoolDataSource
PooledConnection
ConnectionEvent
ConnectionEventListener
StatementEvent
StatementEventListener
PooledConnection
オブジェクトを作成するためにConnectionPoolDataSource
オブジェクトが呼び出されると、接続プール管理プログラムによって新しいPooledConnection
オブジェクトがConnectionEventListener
オブジェクトとして登録されます。 接続が終了するか、エラーが発生した場合、接続プール管理プログラム(リスナー)は、ConnectionEvent
オブジェクトを含む通知を受け取ります。
接続プール管理プログラムがPreparedStatements
用としてStatement
のプールをサポートする場合(サポートするかどうかは、DatabaseMetaData.supportsStatementPooling
メソッドを呼び出すことで判断可能)、接続プール管理プログラムは、自身をStatementEventListener
オブジェクトとして新しいPooledConnection
オブジェクトに登録します。 PreparedStatement
が閉じるか、エラーが発生した場合、接続プール管理プログラム(リスナー)は、StatementEvent
オブジェクトを含む通知を受け取ります。
分散トランザクション
プールされた接続と同様、中間層インフラストラクチャで動作するように実装されたDataSource
オブジェクトによって作成された接続も、分散トランザクションに参加することがあります。 これにより、アプリケーションは、単一トランザクションで複数サーバー上のデータ・ソースにアクセスできるようになります。
分散トランザクションに使用されるクラスとインタフェースは次のとおりです。
XADataSource
XAConnection
XAConnection
インタフェースはPooledConnection
インタフェースから派生しているため、プールされた接続に適用されることは、分散トランザクションを構成する接続にも適用されます。 中間層のトランザクション・マネージャは、すべての処理を透過的に行います。 アプリケーション・コードの唯一の変更点は、アプリケーションがトランザクション・マネージャのトランザクション処理を妨害できなくなったことです。 特に、アプリケーションは、Connection.commit
メソッドやConnection.rollback
メソッドを呼び出すことができません。また、接続を自動コミット・モードに設定することもできません。つまり、Connection.setAutoCommit(true)
を呼び出すことはできません。
アプリケーションは、特別な処理を行うことなく分散トランザクションに参加できます。 通常どおり、DataSource.getConnection
メソッドを使って、使用するデータ・ソースへの接続を作成するだけで済みます。 トランザクション・マネージャは、トランザクションを背後で管理します。 XADataSource
インタフェースはXAConnection
オブジェクトを作成し、各XAConnection
オブジェクトはトランザクション・マネージャが接続を管理するために使用するXAResource
オブジェクトを作成します。
行セット
RowSet
インタフェースは、ほかのさまざまなクラスやインタフェースとともに背後で動作します。 これらのクラスやインタフェースは3つのカテゴリに分けられます。
- イベント通知
RowSetListener
RowSet
オブジェクトは、プロパティを持ち、JavaBeansイベント通知メカニズムに参加しているため、JavaBeansコンポーネントです。RowSetListener
インタフェースは、特定のRowSet
オブジェクトに発生するイベントを通知してもらいたいコンポーネントによって実装されます。 そのようなコンポーネントは、RowSet.addRowSetListener
メソッドを使用して、自身をリスナーとして行セットに登録します。RowSet
オブジェクトが1行を変更、全行を変更、またはカーソル位置を移動すると、このオブジェクトに登録された各リスナーにも通知されます。 リスナーは、通知メソッドの実装を呼び出すことによって実行します。RowSetEvent
内部通知プロセスの一部として、RowSet
オブジェクトはRowSetEvent
のインスタンスを作成してリスナーに渡します。 リスナーは渡されたRowSetEvent
オブジェクトを使用して、どの行セットにイベントがあるかを検出できます。
- メタデータ
RowSetMetaData
このインタフェースはResultSetMetaData
インタフェースから派生しており、RowSet
オブジェクトの列に関する情報を提供します。 アプリケーションではRowSetMetaData
メソッドを使用して、行セットに含まれる列数や各列に含めることができるデータの種類を検出できます。RowSetMetaData
インタフェースは列に関する情報を設定するメソッドを提供しますが、通常、アプリケーションがこれらのメソッドを使用することはありません。 アプリケーションがRowSet
のexecute
メソッドを呼び出すと、RowSet
オブジェクトは行の新しいセットを格納し、RowSetMetaData
オブジェクトは内部的に更新されて、新しい列に関する情報を含むようになります。
- リーダー/ライター機能
RowSetInternal
インタフェースを実装するRowSet
オブジェクトは、関連するRowSetReader
オブジェクトを呼び出すことで、自身にデータを読み込むことができます。 また、関連するRowSetWriter
を呼び出して、行に加えた変更を、データを取得した場所からデータ・ソースへ書き戻すことができます。 引き続きデータ・ソースに接続されている行セットは、データ・ソース上で直接動作するので、リーダーやライターを使用する必要はありません。RowSetInternal
RowSetInternal
インタフェースを実装することで、RowSet
オブジェクトでは内部状態にアクセスしたり、リーダーやライターを呼び出したりできるようになります。 行セットは現在の行の値と、元の値として参照される、現在の行の直前にある行の値を追跡します。 行セットは、(1)コマンド用に設定されたパラメータと、(2)行セットに渡された接続(存在する場合)も追跡します。 行セットはRowSetInternal
メソッドを背後で使用することでこれらの情報にアクセスします。 アプリケーションがこれらのメソッドを直接呼び出すことは通常ありません。RowSetReader
RowSetInternal
インタフェースを実装する、切断されたRowSet
オブジェクトはリーダー(このオブジェクトに関連付けられたRowSetReader
オブジェクト)を呼び出して、データを自身に読み込むことができます。 アプリケーションがRowSet.execute
メソッドを呼び出すと、このメソッドが行セットのリーダーを呼び出し、ほとんどの作業を行います。 リーダーの実装はさまざまですが、一般には、データ・ソースへの接続を確立し、データ・ソースからデータを読み込み、そのデータを行セットに追加し、接続を閉じます。 また、リーダーはその行セット用にRowSetMetaData
オブジェクトを更新することもあります。 行セットの内部状態も、リーダーによって、または直接RowSet.execute
メソッドによって更新されます。RowSetWriter
RowSetInternal
インタフェースを実装する、切断されたRowSet
オブジェクトは、ライター(このオブジェクトに関連付けられたRowSetWriter
オブジェクト)を呼び出して、変更を配下のデータ・ソースに書き戻すことができます。 ライターの実装はさまざまですが、一般には次のように動作します。- データ・ソースへの接続を確立する
- 矛盾があるかどうか、つまり、行セット内の変更された値がデータ・ソースでも変更されているかどうかを確認する
- 矛盾がない場合は、新しい値をデータ・ソースへ書き込む
- 接続を閉じる
RowSet
インタフェースは多くの方法で実装でき、誰もが実装を作成できます。 開発者は自由に想像力を働かせ、行セットの新しい使用方法を見つけ出すことが推奨されています。
パッケージの仕様
関連項目
Addison-Wesley Longmanから出版されているJava Seriesブックでは、javax.sql
パッケージのクラスやインタフェースに関する詳細な情報を参照できます。
- " JDBC™ API Tutorial and Reference, Third Edition "
-
クラス説明
DataSource
、XADataSource
、およびConnectionPoolDataSource
に共通のメソッドを定義するインタフェースです。接続関連のイベントのソースに関する情報を提供するEvent
オブジェクトです。PooledConnection
オブジェクトによって生成されたイベントが通知されるよう登録するオブジェクトです。PooledConnection
オブジェクトのファクトリです。このDataSource
オブジェクトが表す物理データ・ソースへの接続に対するファクトリです。接続プール管理のフックを提供するオブジェクトです。ConnectionPoolDataSource
オブジェクトから作成されたビルダー。data source
オブジェクトが表すデータベースへの接続を確立するために使用されます。JavaBeansコンポーネント・モデルのJDBC APIへのサポートを追加するインタフェース。RowSet
オブジェクトにイベントが発生したときに生成されるEvent
オブジェクトです。RowSet
オブジェクトが自身をRowSetReader
オブジェクトやRowSetWriter
オブジェクトに渡すために実装するインタフェースです。RowSet
オブジェクトの有効期間中に重要なイベントが発生したときに通知を希望するコンポーネントによって実装されているインタフェースです。RowSet
オブジェクトの列に関する情報を格納するオブジェクトです。切断されたRowSet
オブジェクトが、列データ付きで自分自身を生成するために呼び出す機能です。RowSetWriter
インタフェースを実装するオブジェクトで、ライターと呼ばれます。PooledConnection
に登録されたすべてのStatementEventListener
に、StatementEvent
が送信されます。Statementプール内のPreparedStatementで発生したイベントの通知を受けるように登録されているオブジェクトです。分散トランザクションをサポートするオブジェクトです。XADataSource
オブジェクトから作成されたビルダー。data source
オブジェクトが表すデータベースへの接続を確立するために使用されます。内部で使用されるXAConnection
オブジェクトのファクトリです。