11.6.2 JDBC2.0の概要

ここでは,Cosminexus DABroker Libraryで提供する,JDBC2.0基本規格に沿った機能の概要と注意事項について説明します。JDBC1.0が提供するクラスとメソッドの機能,およびJDBC2.0で規格化されていないDBPドライバだけの機能については,マニュアル「Cosminexus アプリケーションサーバ リファレンス API編」を参照してください。

<この項の構成>
(1) ResultSetの拡張
(2) バッチ更新
(3) JDBC SQLタイプの扱い

(1) ResultSetの拡張

JDBC2.0基本規格では,ResultSet(ResultSetクラス)の拡張機能として,「スクロール」と「並行処理」が追加されています。

(a) スクロールタイプ

ResultSetのスクロールタイプには,次の3種類があります。

(b) 並行処理タイプ

ResultSetの並行処理タイプには,次の種類があります。

(c) ResultSetタイプ

スクロールタイプと並行処理タイプを組み合わせることで,ResultSetには6種類のタイプがあります。Cosminexus DABroker Libraryでは,このうち2種類をサポートしています。ResultSetタイプは,ConnectionクラスのcreateStatementメソッド,prepareStatementメソッド,またはprepareCallメソッドで,Statementクラス(またはそのサブクラス)のインスタンスを取得する時に指定します。

6種類のResultSetタイプとCosminexus DABroker Libraryでのサポートを,次の表に示します。

表11-14 ResultSetのタイプ

ResultSetタイプCosminexus DABroker Libraryでのサポート
スクロールタイプ並行処理タイプ
順方向専用型読み取り専用型
更新可能型×
スクロール非反映型読み取り専用型
更新可能型×
スクロール反映型読み取り専用型×
更新可能型×
(凡例)
○:サポートしている
×:サポートしていない

サポートしていないResultSetタイプが指定された場合,エラーにはしないで,指定されたResultSetタイプにいちばん近いResultSetタイプを使用してStatementクラス(またはそのサブクラス)のインスタンスを生成します。また,警告メッセージをConnectionクラスのSQLWarningに格納します。

更新可能型の並行処理タイプはサポートしていないため,ResultSetクラスに使用できないメソッドがあります。これらの使用できないメソッドが呼び出された場合は,無条件にSQLExceptionをthrowします。どのメソッドが使用できないかについては,マニュアル「Cosminexus アプリケーションサーバ リファレンス API編」の「14.7 ResultSetクラス」を参照してください。

(d) スクロール型ResultSet使用時の注意点

スクロール型ResultSetでは,Cosminexus DABroker Library内ですべての検索データをキャッシングします。データ量が大量な場合は,メモリ不足や性能劣化が発生する可能性が大きくなります。このため,スクロール型ResultSetを使用する場合は,「SQLに条件を付加する」,「StatementクラスのsetMaxRowsメソッドを呼び出す」など,検索データ量をあらかじめ抑制してください。

(2) バッチ更新

JDBC2.0基本規格では,Statementクラス,PreparedStatementクラス,およびCallableStatementクラスにバッチ更新機能が追加されています。バッチ更新機能を使うと,複数のSQL,または複数のパラメタ値を登録し,一括で実行できます。

注意
バッチ更新機能を使用する場合,ConnectionクラスのAUTOコミットモードをOFFにしてください。これは,バッチ更新の途中でエラーが発生した場合,そのトランザクションの有効・無効をアプリケーション側で制御する必要があるためです。AUTOコミットモードがON(初期状態)の場合,バッチ更新の途中でエラーが発生しても,エラーが発生する一つ前までのSQL実行は有効となるため,注意が必要です。アプリケーションサーバでJTAトランザクションを使用している場合,AUTOコミットモードはOFFになります。
(a) Statementクラスでのバッチ更新
概要
  • 複数の更新系SQLをaddBatchメソッドで登録します。
  • 登録した更新系SQLを,executeBatchメソッドを使用して一括で実行します。
  • 一括実行の結果として,それぞれの更新系SQLによって更新された行数の配列を返します。
  • 一括実行の途中でエラーが発生した場合,BatchUpdateExceptionをthrowします。
  • 登録したSQL中に検索系SQLがある場合,executeBatchメソッド呼び出し時にBatchUpdateExceptionをthrowします。
注意事項
DABrokerとのインタフェース上,複数のSQLを一括実行できないため,Cosminexus DABroker Libraryでは,登録されたSQLを逐次実行することでバッチ更新を実現しています。
(b) PreparedStatementクラスでのバッチ更新
概要
  • PreparedStatementインスタンス生成時に指定した,更新系SQLに対する?パラメタを,通常の手順(setXXXメソッド)で設定します。
  • addBatchメソッドで,?パラメタのセットを登録します。
  • 登録した複数セットの?パラメタを,executeBatchメソッドで一括実行します。
  • 一括実行の結果として,それぞれの?パラメタのセットで更新された行数の配列を返します。
  • 一括実行の途中でエラーが発生した場合,BatchUpdateExceptionをthrowします。
  • PreparedStatementインスタンス生成時に指定したSQLが検索系SQLである場合,executeBatchメソッド呼び出し時にBatchUpdateExceptionをthrowします。
注意事項
定義系および制御系SQLについては,addBatchメソッドを実行しないでください。
(c) CallableStatementクラスでのバッチ更新
概要
  • CallableStatementインスタンス生成時に指定した,SQLに対する?パラメタを,通常の手順(setXXXメソッド)で設定します。
  • addBatchメソッドで,入力パラメタのセットを登録します。
  • 登録した複数セットの入力パラメタを,executeBatchメソッドで一括実行します。
  • 一括実行の結果として,それぞれの入力パラメタのセットで実行された,SQLの返却値(更新行数)の配列を返します。
  • 一括実行の途中でエラーが発生した場合,BatchUpdateExceptionをthrowします。
  • CallableStatementインスタンス生成時に指定したSQLが更新行数を返さない場合,および出力パラメタか入出力パラメタを持つ場合,executeBatchメソッド呼び出し時にBatchUpdateExceptionをthrowします。
注意事項
定義系および制御系SQLについては,addBatchメソッドを実行しないでください。
(d) HiRDBの場合のバッチ更新

HiRDBの場合のバッチ更新処理は,次の2種類に分けられます。

HiRDBの配列更新機能とは,データベースにより提供される次の機能を指します。

HiRDBの配列更新機能では,複数の?パラメタセットを配列形式で扱い,一度に処理することができます。そのため,データベースとの通信回数が減り,大量のデータを高速に更新できます。

HiRDBの配列更新機能を使用するには,BlockUpdate設定をtrueにします。ただし,接続するHiRDBのバージョンによって使用できない場合があります。HiRDBの配列更新機能の詳細については,マニュアル「HiRDB UAP開発ガイド」およびマニュアル「HiRDB SQLリファレンス」を参照してください。

●addBatchメソッド-executeBatchメソッド使用時の仕様

次に,バッチ更新時に使用するaddBatchメソッド-executeBatchメソッド使用時の仕様を,BlockUpdate設定がtrueの場合とfalseの場合に分けて示します。

表11-15 addBatchメソッド-executeBatchメソッド使用時の仕様(BlockUpdate設定がtrue,HiRDBの場合)

実行するSQL文DABrokerの仕様(処理方法)
HiRDB Version 6HiRDB Version 7 07-00以降かつ07-00-/K以前HiRDB Version 7 07-00-/L以降かつHiRDB Version 7 07-01未満HiRDB Version 7 07-01以降
INSERT文
(VALUES句指定)
逐次実行一括実行一括実行一括実行
INSERT文
(SELECT句指定)
逐次実行KFPA19408-E逐次実行一括実行
UPDATE文逐次実行KFPA19408-E逐次実行一括実行
DELETE文逐次実行KFPA19408-E逐次実行一括実行
CALL文(OUTまたはINOUTパラメタあり)KFDJ00010-EKFDJ00010-EKFDJ00010-EKFDJ00010-E
CALL文(INパラメタだけ)逐次実行逐次実行逐次実行逐次実行
(凡例)
一括実行:HiRDBの配列更新機能を使用してSQLを一括実行する
逐次実行:HiRDBの配列更新機能を使用しないでSQLを分けて実行する
KFPA19408-E:エラー(KFPA19408-E)が発生する。HiRDBの配列更新機能は使用できない
KFDJ00010-E:エラー(KFDJ00010-E)が発生する。JDBC2.0規格では,executeBatchメソッドで更新行数を返さないもの(SELECTなど)が含まれていた場合,例外となる

表11-16  addBatchメソッド-executeBatchメソッド使用時の仕様(BlockUpdate設定がfalseまたは指定なし,HiRDBの場合)

実行するSQL文DABrokerの仕様(処理方法)
INSERT文(VALUES句指定)逐次実行
INSERT文(SELECT句指定)逐次実行
UPDATE文逐次実行
DELETE文逐次実行
SELECT文KFDJ00010-E
CALL文(OUTまたはINOUTパラメタあり)KFDJ00010-E
CALL文(INパラメタだけ)逐次実行
(凡例)
逐次実行:HiRDBの配列更新機能を使用しないでSQLを分けて実行する
KFDJ00010-E:エラー(KFDJ00010-E)が発生する。JDBC2.0規格では,executeBatchメソッドで更新行数を返さないもの(SELECTなど)が含まれていた場合,例外となる

表11-17 addBatchメソッド-executeBatchメソッド使用時の仕様(BlockUpdate設定がtrue,HiRDBクライアント経由XDM/RD E2の場合)

実行するSQLDABrokerの仕様(処理方式)
HiRDBクライアント08-02未満HiRDBクライアント08-02以降
XDM/RD E2(11-03未満)XDM/RD E2(11-03以降)
INSERT文(VALUES句指定)逐次実行逐次実行一括実行
INSERT文(SELECT句指定)逐次実行逐次実行一括実行
UPDATE文逐次実行逐次実行一括実行
DELETE文逐次実行逐次実行一括実行
SELECT文KFDJ00010-EKFDJ00010-EKFDJ00010-E
CALL文(OUT,またはINOUTパラメタ有)KFDJ00010-EKFDJ00010-EKFDJ00010-E
CALL文(INパラメタだけ)逐次実行逐次実行逐次実行
(凡例)
一括実行:HiRDBの配列更新機能を使用してSQLを一括実行する
逐次実行:HiRDBの配列更新機能を使用しないでSQLを分けて実行する
KFDJ00010-E:エラー(KFDJ00010-E)が発生する。JDBC2.0規格では,executeBatchメソッドで更新行数を返さないもの(SELECTなど)が含まれている場合,例外となる

表11-18 addBatchメソッド-executeBatchメソッド使用時の仕様(BlockUpdate設定がfalseまたは指定なし,HiRDBクライアント経由XDM/RD E2の場合)

実行するSQL文DABrokerの仕様
INSERT文(VALUES句指定)逐次実行
INSERT文(SELECT句指定)逐次実行
UPDATE文逐次実行
DELETE文逐次実行
SELECT文KFDJ00010-E
CALL文(OUT,またはINOUTパラメタあり)KFDJ00010-E
CALL文(INパラメタだけ)逐次実行
(凡例)
逐次実行:HiRDBの配列更新機能を使用しないでSQLを分けて実行する
KFDJ00010-E:エラー(KFDJ00010-E)が発生する。JDBC2.0規格では,executeBatchメソッドで更新行数を返さないもの(SELECTなど)が含まれている場合,例外となる

●HiRDBの配列更新機能の使用方法

HiRDBの配列更新機能の使用方法を次に示します。

●HiRDBの配列更新機能使用時の注意事項
(e) Oracleの場合のバッチ更新

ここでは,Oracleの場合のバッチ更新について説明します。

●addBatchメソッド-executeBatchメソッド使用時の仕様

次に,PreparedStatementおよびCallableStatementでのaddBatchメソッド-executeBatchメソッド使用時の仕様を,BlockUpdate設定がtrueの場合,falseの場合に分けて示します。

表11-19  addBatchメソッド-executeBatchメソッド使用時の仕様(BlockUpdate設定がtrue,Oracleの場合)

実行するSQL文DABrokerの仕様(処理方法)
INSERT文(VALUES句指定)逐次実行
INSERT文(SELECT句指定)逐次実行
UPDATE文逐次実行
DELETE文逐次実行
SELECT文KFDJ00010-E
BEGIN文(OUTまたはINOUTパラメタあり)KFDJ00010-E
BEGIN文(INパラメタだけ)逐次実行
(凡例)
逐次実行:SQLを分けて実行する
KFDJ00010-E:エラー(KFDJ00010-E)が発生する。JDBC2.0規格では,executeBatchメソッドで更新行数を返さないもの(SELECTなど)が含まれていた場合,例外となる

表11-20  addBatchメソッド-executeBatchメソッド使用時の仕様(BlockUpdate設定がfalseまたは指定なし,Oracleの場合)

実行するSQL文DABrokerの仕様(処理方法)
INSERT文(VALUES句指定)逐次実行
INSERT文(SELECT句指定)逐次実行
UPDATE文逐次実行
DELETE文逐次実行
SELECT文KFDJ00010-E
BEGIN文(OUTまたはINOUTパラメタあり)KFDJ00010-E
BEGIN文(INパラメタだけ)逐次実行
(凡例)
逐次実行:SQLを分けて実行する
KFDJ00010-E:エラー(KFDJ00010-E)が発生する。JDBC2.0規格では,executeBatchメソッドで更新行数を返さないもの(SELECTなど)が含まれていた場合,例外となる

●addBatchメソッド使用時の注意事項

(3) JDBC SQLタイプの扱い

JDBC2.0基本規格では,幾つかの新しいJDBC SQLタイプが追加されています。追加されたJDBC SQLタイプとCosminexus DABroker Libraryでのサポートを,次の表に示します。

表11-21  追加されたJDBC SQLタイプとCosminexus DABroker Libraryでのサポート

追加されたJDBC SQLタイプCosminexus DABroker Libraryでのサポート
BLOB
CLOB
ARRAY×
REF×
DISTINCT×
STRUCT×
JAVA OBJECT×
(凡例)
○:Oracle9i,Oracle10g,およびHiRDBでサポートしている
△:Oracle9i,およびOracle10gでだけサポートしている
×:サポートしていない
(a) 検索データ取得時のデータ変換

追加されたJDBC SQLタイプと,ResultSetクラスのgetXXXメソッドとのデータ変換について,次の表に示します。変換できないJDBC SQLタイプに対してgetXXXメソッドが呼び出された場合は,SQLExceptionをthrowします。接続データベースがどのJDBC SQLタイプをサポートしているかは,「11.6.7 データ型の対応」を参照してください。

なお,JDBC2.0規格ではgetUnicodeStreamメソッドが推奨されないメソッドとなったため,代わりにgetCharacterStreamが追加されています。

表11-22  ResultSetクラスのgetXXXメソッドとJDBC SQLタイプとのデータ変換 (1)

getXXXメソッドJDBC SQLタイプ
B
I
T
T
I
N
Y
I
N
T
S
M
A
L
L
I
N
T
I
N
T
E
G
E
R
B
I
G
I
N
T
F
L
O
A
T
R
E
A
L
D
O
U
B
L
E
N
U
M
E
R
I
C
D
E
C
I
M
A
L
C
H
A
R
V
A
R
C
H
A
R
L
O
N
G
V
A
R
C
H
A
R
getByte
getShort
getInt
getLong
getFloat
getDouble
getBigDecimal
getBoolean
getString
getBytes
getDate※1
getTime※1
getTimestamp※1
getAsciiStream
getUnicodeStream
getBinaryStream
getObject
getCharacter
Stream
getArray
(未サポート)
getBlob※2
getClob※3
getRef
(未サポート)
(凡例)
◎:完全に変換できる
○:変換できる。ただし,変換元のデータの内容によってはデータの欠落や変換エラーとなることがある
■:設定値が定義長に満たない場合,エラーが発生する
-:変換できない
注※1
引数にjava.util.Calendarオブジェクトを指定するgetDate,getTimeおよびgetTimestampメソッドを実行すると,データベースに格納されたデータが指定したjava.util.Calendarオブジェクトのタイムゾーンであるとして,実行しているアプリケーションのデフォルトのタイムゾーンに変換して取得します。
注※2
Oracle9i,Oracle10g,およびHiRDBでサポートしています。
注※3
Oracle9i,およびOracle10gでサポートしています。

 

表11-23  ResultSetクラスのgetXXXメソッドとJDBC SQLタイプとのデータ変換 (2)

getXXXメソッドJDBC SQLタイプ
D
A
T
E
T
I
M
E
T
I
M
E
S
T
A
M
P
B
I
N
A
R
Y
V
A
R
B
I
N
A
R
Y
L
O
N
G
V
A
R
B
I
N
A
R
Y
J
A
V
A
O
B
J
E
C
T
S
T
R
U
C
T
A
R
R
A
Y
B
L
O
B
C
L
O
B
R
E
F
getByte
getShort
getInt
getLong
getFloat
getDouble
getBigDecimal
getBoolean
getString
getBytes
getDate※1
getTime※1
getTimestamp※1
getAsciiStream
getUnicodeStream
getBinaryStream
getObject
getCharacter
Stream
getArray
(未サポート)
getBlob※2※4
getClob※3
getRef
(未サポート)
(凡例)
◎:完全に変換できる
○:変換できる。ただし,変換元のデータの内容によってはデータの欠落や変換エラーとなることがある
●:完全に変換できる組み合わせは,接続するデータベースがOracle9iまたはOracle10gの場合以外では,JDBC SQLタイプが未サポートのため使えない
▼:変換できる組み合わせは,接続するデータベースがOracle9iまたはOracle10gの場合以外では,JDBC SQLタイプが未サポートのため使えない
▲:完全に変換できる組み合わせは,JDBC SQLタイプが未サポートのため使えない
△:変換できる組み合わせは,JDBC SQLタイプが未サポートのため使えない
-:変換できない
注※1
引数にjava.util.Calendarオブジェクトを指定するgetDate,getTimeおよびgetTimestampメソッドを実行すると,データベースに格納されたデータが指定したjava.util.Calendarオブジェクトのタイムゾーンであるとして,実行しているアプリケーションのデフォルトのタイムゾーンに変換して取得します。
注※2
Oracle9i,Oracle10g,およびHiRDBでサポートしています。
注※3
Oracle9i,およびOracle10gでサポートしています。
注※4
HiRDBでだけサポートしています。
(b) ?パラメタ設定時のデータ変換

追加されたJDBC SQLタイプと,PreparedStatementクラスのsetXXXメソッドとのデータ変換について,次の表に示します。JDBC SQLタイプをサポートしていない場合,setXXXメソッドはSQLExceptionをthrowします。接続データベースがどのJDBC SQLタイプをサポートしているかは,「11.6.7 データ型の対応」を参照してください。

なお,JDBC2.0規格では,setUnicodeStreamメソッドが推奨されないメソッドとなったため,代わりにsetCharacterStreamが追加されています。

表11-24  追加されたJDBC SQLタイプとsetXXXメソッド

setXXXメソッドデータ変換されるJDBC SQLタイプ
setCharacterStreamCHAR,VARCHAR,またはLONGVARCHAR
setRef(未サポート)REF
setBlob※1BLOB,LONGVARBINARY
setClob※2CLOB
setArray(未サポート)ARRAY
注※1
Oracle9i,Oracle10g,およびHiRDBでサポートしています。
注※2
Oracle9i,およびOracle10gでサポートしています。

 

表11-25  setXXXメソッドとJDBC SQLタイプとのデータ変換 (1)

setXXXメソッドJDBC SQLタイプ
B
I
T
T
I
N
Y
I
N
T
S
M
A
L
L
I
N
T
I
N
T
E
G
E
R
B
I
G
I
N
T
F
L
O
A
T
R
E
A
L
D
O
U
B
L
E
N
U
M
E
R
I
C
D
E
C
I
M
A
L
C
H
A
R
V
A
R
C
H
A
R
L
O
N
G
V
A
R
C
H
A
R
setByte
setShort
setInt
setLong
setFloat
setDouble
setBigDecimal
setBoolean
setString
setBytes
setDate
setTime
setTimestamp
setAsciiStream※4※4※4
setUnicodeStream※1
setBinaryStream
setObject
setCharacterStream※5※5※5
setArray
(未サポート)
setBlob※2
setClob※3
setRef
(未サポート)
(凡例)
◎:完全に変換できる
○:変換できる。ただし,変換元のデータの内容によってはデータの欠落や変換エラーとなることがある
-:変換できない
注※1
Oracle9i,Oracle10g,およびHiRDBでサポートしています。
注※2
Oracle9i,およびOracle10gでサポートしています。
注※3
長さが0のデータを設定するとエラーになります。
注※4
接続データベースがOracleの場合,長さが0のデータを設定すると,NULL値に変換します。
注※5
java.io.Readerオブジェクトから取得できるデータの長さが引数で指定した長さより短い場合,次のように引数で指定した長さまで0を補完します。
[図データ]

 

表11-26  setXXXメソッドとJDBC SQLタイプとのデータ変換(2)

setXXXメソッドJDBC SQLタイプ
D
A
T
E
T
I
M
E
T
I
M
E
S
T
A
M
P
B
I
N
A
R
Y
V
A
R
B
I
N
A
R
Y
L
O
N
G
V
A
R
B
I
N
A
R
Y
J
A
V
A
O
B
J
E
C
T
S
T
R
U
C
T
A
R
R
A
Y
B
L
O
B
C
L
O
B
R
E
F
setByte
setShort
setInt
setLong
setFloat
setDouble
setBigDecimal
setBoolean
setString
setBytes
setDate
setTime
setTimestamp
setAsciiStream※4※4
setUnicodeStream※3
setBinaryStream※4※4
setObject
setCharacterStream※5※5※5
setArray(未サポート)
setBlob※1※1※2※4
setClob※2※4
setRef(未サポート)
(凡例)
◎:完全に変換できる
○:変換できる。ただし,変換元のデータの内容によってはデータの欠落や変換エラーとなることがある
●:完全に変換できる組み合わせは,接続するデータベースがOracle9iまたはOracle10gの場合以外では,JDBC SQLタイプが未サポートのため使えない
▼:変換できる組み合わせは,接続するデータベースがOracle9iまたはOracle10gの場合以外では,JDBC SQLタイプが未サポートのため使えない
▲:完全に変換できる組み合わせは,JDBC SQLタイプが未サポートのため使えない
△:変換できる組み合わせは,JDBC SQLタイプが未サポートのため使えない
-:変換できない
注※1
Oracle9i,Oracle10g,およびHiRDBでサポートしています。
注※2
Oracle9i,およびOracle10gでサポートしています。
注※3
長さが0のデータを設定するとエラーになります。
注※4
接続データベースがOracleである場合,長さが0であるデータを設定するとNULL値に変換します。
注※5
java.io.Readerオブジェクトから取得できるデータの長さが引数で指定した長さより短い場合,次のように引数で指定した長さまで0を補完します。
[図データ]