Hitachi

Cosminexus V11 アプリケーションサーバ 機能解説 互換編


18.7.3 JDBC2.0拡張機能の概要

ここでは,DABroker Libraryで提供するJDBC2.0拡張機能の概要を説明します。各メソッドでの制限事項については,「18.10 DABroker Libraryで使用するAPIの一覧」を参照してください。

〈この項の構成〉

(1) JNDI連携

JNDI連携とは,DBMSとの接続情報をJNDIに登録し,登録した接続情報を使用してDBMSと接続する機能です。一度接続情報を登録すれば,DBMSとの接続時に接続情報を設定する必要がなくなります。JNDI連携の操作については,「18.7.5 JDBC2.0拡張機能を使用したデータベース接続の設定」を参照してください。

(2) 接続プール

接続プール機能は,DataSourceオブジェクトとJNDIを使用してデータベースと接続した場合だけ使用できます。

データベースとの接続をためる(プール)機能の概要について説明します。

(a) 概要

DBMSとの接続をプールします。この機能は,DBMSとの接続および解放によるオーバーヘッドを縮小し,サーバアプリケーションの性能向上に役立ちます。

  • アプリケーションに影響を与えないため,接続プールの有無を意識する必要がない。

  • システム構築時に,接続プール機能を任意に選択できる(ユーザが作成する,アプリケーションサーバのベンダが提供するものを使用する,またはJDBCのベンダが提供するものを使用する)。

  • 接続プール機能では,アプリケーションとのインタフェースとして,DataSourceクラスを提供する。

  • JDBC2.0拡張機能では,接続プール機能とのインタフェースとして,ConnectionPoolDataSourceクラスとPooledConnectionクラスを提供する。

  • ConnectionPoolDataSourceクラスは,JDBC2.0拡張機能が提供するDataSourceクラスと同様に,接続情報の設定および取得用のメソッドを提供する。

(b) 関連するクラス

接続プール機能に関連するクラスを次の表に示します。

表18‒48  接続プールに関連するクラス

クラス

概要

javax.sql.

ConnectionEventListener

  • 接続プール機能が提供

  • 接続プール機能で,接続の切断,SQLエラーなどをこのクラスのオブジェクトから検知※1

javax.sql.DataSource

  • 接続プール機能が提供

  • データベース接続時のアプリケーションとのインタフェース

  • 接続プールを制御

  • JNDIに登録して使用

javax.sql.

ConnectionPoolDataSource

  • JDBC2.0拡張機能が提供※2

  • データベース接続に必要な接続情報の設定および取得用のメソッドを提供

  • 接続プール機能が使用

  • JNDIに登録して使用

  • このクラスのオブジェクトからPooledConnectionオブジェクトを取得

javax.sql.PooledConnection

  • JDBC2.0拡張機能が提供※2

  • 接続プール機能が使用

  • このクラスのオブジェクトがプール対象

  • このクラスのオブジェクトからConnectionオブジェクトを取得

注※1

connectionErrorOccurredが返されるのは次のエラーコードの場合です。

接続データベースがHiRDB:-720,-722,-723,-728,-732,-932,-1700

接続データベースがOracle:28,1012,3113,3114,12571

注※2

JDBC2.0拡張機能が提供するパッケージ名称とクラス名称を次に示します。

種類

名称

パッケージ

JP.co.Hitachi.soft.DBPSV_Driver

ConnectionPoolDataSourceクラス

JdbcDbpsvConnectionPoolDataSource

PooledConnectionクラス

JdbcDbpsvPooledConnection

(3) 分散トランザクション機能

分散トランザクション機能とは,Sun Microsystemsの提唱するJava Transaction API(JTA)規格を基に,トランザクションマネージャと連携する,接続プール機能の拡張機能です。

分散トランザクション機能は,XADataSourceクラスとJNDIを使用してデータベースと接続した場合だけ使用できます。

分散トランザクション機能の概要について説明します。

(a) 概要

JTSおよびJTAとの連携によって,Sun Microsystemsの提唱するJava Transaction API(JTA)規格に沿った,分散トランザクションを構築できます。

  • システム構築時に,トランザクション連携機能を任意に選択できます(ユーザが作成する,APServerベンダ提供のものを使用する,またはJDBCベンダが提供するものを使用する)。

  • トランザクション連携機能は,接続プールの拡張機能として,トランザクションマネージャが提供する,JTAやJTSを使用します。

  • トランザクション連携機能では,アプリケーションとのインタフェースとして,DataSourceクラスを提供します。

  • JDBC2.0拡張機能では,トランザクション連携機能とのインタフェースとして,XADataSourceクラスとXAConnectionクラスを提供します。また,トランザクションマネージャとのインタフェースとして,XAResourceクラスを提供します。

  • XADataSourceクラスは,JDBC2.0拡張機能が提供するDataSourceクラスと同様に,接続情報の設定および取得用のメソッドを提供します。

接続プールの場合と同様に,アプリケーションが使用するConnectionオブジェクトはXAConnectionクラスが生成しますが,PooledConnectionクラスやJDBC2.0拡張機能が提供するDataSourceクラスが生成するConnectionオブジェクトと比べて,次の点が異なります。

  • 接続情報にXALocalCommitMode(true)を設定していない場合には,XADataSourceクラス使用時,AutoCommitのモードはOFFになります。また,AutoCommitのモードをONにしたり(ConnectionクラスのsetAutoCommit(true)メソッドの発行),Connectionクラスのcommitメソッド,またはrollbackメソッドを実行したりすると,SQLExceptionとなります。ただし,XALocalCommitMode(true)をプロパティに設定している場合だけAutoCommitのモードはONとなります。

  • 一つのXAResourceに対して複数のConnectionクラスを生成してもトランザクションは一つになります。XAResource,Connectionは一対一で使用するようにしてください。トランザクションがローカルトランザクション※1の場合,ConnectionクラスのsetAutoCommit(true)メソッド,commitメソッド,およびrollbackメソッドを呼び出せます。同じXAResourceを使用するトランザクションがグローバルトランザクション※2を開始すると,自動的にAutoCommitのモードはOFFになります。再び,トランザクションがローカルトランザクションに移行すると,開始前のAutoCommitのモードに変更されます。複数のConnectionを使用して,トランザクションがローカルトランザクションのときにsetAutoCommitメソッドでAutoCommitのモードを変更する場合は,すべてのConnectionクラスのオブジェクトに対してそれぞれsetAutoCommitメソッドを呼び出してAutoCommitのモードを統一させる必要があります。現在のトランザクションがローカルトランザクションで,AutoCommitのモードがOFFの状態で新たにConnectionを生成した場合,新しいConnectionクラスのオブジェクトに対してsetAutoCommit(false)を実行してください。

    注※1

    ローカルトランザクションとは,XAResourceクラスのstart実行前,またはXAResourceクラスのend実行後の状態にあるトランザクションのことです。

    注※2

    グローバルトランザクションとは,XAResourceクラスのstart実行後,またはXAResourceクラスのendを実行するまでの状態にあるトランザクションのことで,トランザクションマネージャがトランザクション制御を行っている状態を指します。

  • 次の状態のとき,Connectionクラスのcloseメソッドを実行しても,接続しているデータベースによってトランザクションが決着されないことがあります。

    • 接続情報にXALocalCommitMode(true)を設定している。

    • AutoCommitのモードをOFFにしている。

    • ローカルトランザクション内でSQLを実行し,Connectionクラスのcommitメソッド,またはrollbackメソッドを実行しない。

    トランザクションを決着させるには,Connectionクラスのcloseメソッドを実行する前に,明示的にConnectionクラスのcommitメソッド,またはrollbackメソッドを実行する必要があります。

  • HiRDBの配列更新機能を使用するには,setXALocalCommitMode(true),およびsetBlockUpdate(true)に設定してHiRDBに接続後,AutoCommit(false)を指定する必要があります。HiRDBにsetXALocalCommitMode(true)を設定して接続し,HiRDBの配列更新機能を使用する例を次に示します。

    なお,HiRDBの配列更新機能については,「18.7.2(2) バッチ更新」を参照してください。

    XADataSource xads = new XADataSource();
    xads.setDatabaseName("HIRDB");
    xads.setXALocalCommitMode(true);
                    ・
                    ・
    Connection con = xaconnection.getConnection();
    String sql = "INSERT INTO SAMPLE VALUES(?)";
    PreparedStatement pst = con.prepareStatement(sql);
    con.setAutoCommit(false);
    pst.setInt(1,10);
    pst.addBatch();
    pst.setInt(1,20);
    pst.addBatch();
    pst.executeBatch();
    con.commit();
  • DABroker Libraryは,SQLの前処理を複数のCommit,Rollbackにわたって保持します。

    この機能をXA環境下で使用できるデータベースは,HiRDBのバージョンが07-01以降です。また,SQLの前処理の保持機能が使用できるのは,グローバルトランザクション,およびローカルトランザクションを混在せずに使用している場合だけです。

    ローカルトランザクションとグローバルトランザクションを混在させて使用すると,ローカルトランザクションSQLの前処理の保持機能は使用できません。

    XA環境下でローカルトランザクションとグローバルトランザクションが混在したJavaUPの場合の前処理保持状態を次に示します。

    図18‒5 XA環境下でローカルトランザクションとグローバルトランザクションが混在したJavaUPの場合の前処理保持状態

    [図データ]

(b) 関連するクラス

分散トランザクション機能に関連するクラスを次の表に示します。

表18‒49  分散トランザクションに関連するクラス

クラス

概要

javax.sql.

ConnectionEventListener

  • トランザクション連携機能が提供

  • トランザクション連携機能で,接続の切断,SQLエラーなどをこのクラスのオブジェクトから検知※1

javax.sql.DataSource

  • トランザクション連携機能が提供

  • データベース接続時のアプリケーションとのインタフェース

  • トランザクションマネージャとの連携および接続プールを制御

  • JNDIに登録して使用

javax.sql.XADataSource

  • JDBC2.0拡張機能が提供※2

  • データベース接続に必要な接続情報の設定および取得用のメソッドを提供

  • トランザクション連携機能が使用

  • JNDIに登録して使用

  • このクラスのオブジェクトからXAConnectionオブジェクトを取得

javax.sql.XAConnection

  • JDBC2.0拡張機能が提供※2

  • PooledConnectionクラスのサブクラス

  • トランザクション連携機能が使用

  • このクラスのオブジェクトがプール対象

  • このクラスのオブジェクトからConnectionオブジェクトを取得

javax.transaction.xa.

XAResource

  • JDBC2.0拡張機能が提供※2

  • トランザクションマネージャが使用するXA関連メソッドを提供

javax.transaction.xa.Xid

  • JDBC2.0拡張機能※2およびトランザクションマネージャが提供

  • XAResourceクラスの引数および戻り値として使用

注※1

connectionErrorOccurredが返されるのは次のエラーコードの場合です。

接続データベースがHiRDB:-720,-722,-723,-728,-732,-932,-1700

接続データベースがOracle:28,1012,3113,3114,12571

注※2

JDBC2.0拡張機能が提供するパッケージ名称とクラス名称を次に示します。

種類

名称

パッケージ

JP.co.Hitachi.soft.DBPSV_Driver

XADataSourceクラス

JdbcDbpsvXADataSource

XAConnectionクラス

JdbcDbpsvXAConnection

XAResourceクラス

JdbcDbpsvXAResource

Xidクラス

JdbcDbpsvXid