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) 関連するクラス
接続プール機能に関連するクラスを次の表に示します。
クラス |
概要 |
---|---|
javax.sql. ConnectionEventListener |
|
javax.sql.DataSource |
|
javax.sql. ConnectionPoolDataSource |
|
javax.sql.PooledConnection |
|
種類 |
名称 |
---|---|
パッケージ |
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) 関連するクラス
分散トランザクション機能に関連するクラスを次の表に示します。
クラス |
概要 |
---|---|
javax.sql. ConnectionEventListener |
|
javax.sql.DataSource |
|
javax.sql.XADataSource |
|
javax.sql.XAConnection |
|
javax.transaction.xa. XAResource |
|
javax.transaction.xa.Xid |
|
種類 |
名称 |
---|---|
パッケージ |
JP.co.Hitachi.soft.DBPSV_Driver |
XADataSourceクラス |
JdbcDbpsvXADataSource |
XAConnectionクラス |
JdbcDbpsvXAConnection |
XAResourceクラス |
JdbcDbpsvXAResource |
Xidクラス |
JdbcDbpsvXid |