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

[目次][用語][索引][前へ][次へ]

4.7.2 JDBC2.0の概要

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

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

(1) ResultSetの拡張

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

(a) スクロールタイプ

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

(b) 並行処理タイプ

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

(c) ResultSetタイプ

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

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

表4-35 ResultSetのタイプ

ResultSetタイプ DABroker Libraryでのサポート
スクロールタイプ 並行処理タイプ
順方向専用型 読み取り専用型
更新可能型 ×
スクロール非反映型 読み取り専用型
更新可能型 ×
スクロール反映型 読み取り専用型 ×
更新可能型 ×

(凡例)
○:サポートしている
×:サポートしていない

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

更新可能型の並行処理タイプはサポートしていないため,ResultSetクラスに使用できないメソッドがあります。これらの使用できないメソッドが呼び出された場合は,無条件にSQLExceptionをthrowします。どのメソッドが使用できないかについては,「4.16 ResultSetクラス」を参照してください。

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

スクロール型ResultSetでは,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を一括実行できないため,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の場合に分けて示します。

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

実行するSQL文 DABrokerの仕様(処理方法)
HiRDB Version 6 HiRDB 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-E KFDJ00010-E KFDJ00010-E KFDJ00010-E
CALL文(INパラメタだけ) 逐次実行 逐次実行 逐次実行 逐次実行

(凡例)
一括実行:HiRDBの配列更新機能を使用してSQLを一括実行する
逐次実行:HiRDBの配列更新機能を使用しないでSQLを分けて実行する
KFPA19408-E:エラー(KFPA19408-E)が発生する。HiRDBの配列更新機能は使用できない
KFDJ00010-E:エラー(KFDJ00010-E)が発生する。JDBC2.0規格では,executeBatchメソッドで更新行数を返さないもの(SELECTなど)が含まれていた場合,例外となる

表4-37  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など)が含まれていた場合,例外となる

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

実行するSQL DABrokerの仕様(処理方式)
HiRDBクライアント08-02未満 HiRDBクライアント08-02以降
XDM/RD E2(11-03未満) XDM/RD E2(11-03以降)
INSERT文(VALUES句指定) 逐次実行 逐次実行 一括実行
INSERT文(SELECT句指定) 逐次実行 逐次実行 一括実行
UPDATE文 逐次実行 逐次実行 一括実行
DELETE文 逐次実行 逐次実行 一括実行
SELECT文 KFDJ00010-E KFDJ00010-E KFDJ00010-E
CALL文(OUT,またはINOUTパラメタ有) KFDJ00010-E KFDJ00010-E KFDJ00010-E
CALL文(INパラメタだけ) 逐次実行 逐次実行 逐次実行

(凡例)
一括実行:HiRDBの配列更新機能を使用してSQLを一括実行する
逐次実行:HiRDBの配列更新機能を使用しないでSQLを分けて実行する
KFDJ00010-E:エラー(KFDJ00010-E)が発生する。JDBC2.0規格では,executeBatchメソッドで更新行数を返さないもの(SELECTなど)が含まれている場合,例外となる

表4-39 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の場合に分けて示します。

表4-40  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など)が含まれていた場合,例外となる

表4-41  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タイプとDABroker Libraryでのサポートを,次の表に示します。

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

追加されたJDBC SQLタイプ 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タイプをサポートしているかは,「4.7.7 データ型の対応」を参照してください。

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

表4-43  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でサポートしています。
 

表4-44  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タイプをサポートしているかは,「4.7.7 データ型の対応」を参照してください。

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

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

setXXXメソッド データ変換されるJDBC SQLタイプ
setCharacterStream CHAR,VARCHAR,またはLONGVARCHAR
setRef(未サポート) REF
setBlob※1 BLOB,LONGVARBINARY
setClob※2 CLOB
setArray(未サポート) ARRAY

注※1
Oracle9i,Oracle10g,およびHiRDBでサポートしています。

注※2
Oracle9i,およびOracle10gでサポートしています。
 

表4-46  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を補完します。
[図データ]

 

表4-47  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を補完します。
[図データ]