モジュール java.sql

パッケージjavax.sql


パッケージjavax.sql
Javaプログラミング言語からサーバー側のデータ・ソースにアクセスして処理するためのAPIを提供します。 このパッケージはjava.sqlパッケージを補足するもので、バージョン1.4リリースの時点ではJava Platform, Standard Edition (Java SE)に含まれています。 これは、JavaプラットフォームであるEnterprise Edition (Java EE)の重要な部分のままです。

javax.sqlパッケージは、次のものを提供します。

  1. データ・ソースとの接続を確立するための、DriverManagerの代替となるDataSourceインタフェース
  2. 接続プールと文のプール
  3. 分散トランザクション
  4. 行セット

アプリケーションではDataSourceRowSetを直接使用しますが、接続プール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
接続プール管理プログラムは3層アーキテクチャの中間層で機能し、これらのクラスやインタフェースを背後で使用します。 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つのカテゴリに分けられます。
  1. イベント通知
    • RowSetListener
      RowSetオブジェクトは、プロパティを持ち、JavaBeansイベント通知メカニズムに参加しているため、JavaBeansコンポーネントです。
      RowSetListenerインタフェースは、特定のRowSetオブジェクトに発生するイベントを通知してもらいたいコンポーネントによって実装されます。 そのようなコンポーネントは、RowSet.addRowSetListenerメソッドを使用して、自身をリスナーとして行セットに登録します。

      RowSetオブジェクトが1行を変更、全行を変更、またはカーソル位置を移動すると、このオブジェクトに登録された各リスナーにも通知されます。 リスナーは、通知メソッドの実装を呼び出すことによって実行します。

    • RowSetEvent
      内部通知プロセスの一部として、RowSetオブジェクトはRowSetEventのインスタンスを作成してリスナーに渡します。
      リスナーは渡されたRowSetEventオブジェクトを使用して、どの行セットにイベントがあるかを検出できます。
  2. メタデータ
    • RowSetMetaData
      このインタフェースはResultSetMetaDataインタフェースから派生しており、RowSetオブジェクトの列に関する情報を提供します。
      アプリケーションではRowSetMetaDataメソッドを使用して、行セットに含まれる列数や各列に含めることができるデータの種類を検出できます。

      RowSetMetaDataインタフェースは列に関する情報を設定するメソッドを提供しますが、通常、アプリケーションがこれらのメソッドを使用することはありません。 アプリケーションがRowSetexecuteメソッドを呼び出すと、RowSetオブジェクトは行の新しいセットを格納し、RowSetMetaDataオブジェクトは内部的に更新されて、新しい列に関する情報を含むようになります。

  3. リーダー/ライター機能
    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 "

  • クラス
    説明
    DataSourceXADataSource、および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オブジェクトのファクトリです。