ヘッダーをスキップ
Oracle Database JDBC開発者ガイドおよびリファレンス
11gリリース1(11.1)
E05720-02
  目次
目次
索引
索引

戻る
戻る
次へ
次へ
 

B コーディングのヒント

この付録では、Java Database Connectivity(JDBC)アプリケーションまたはアプレットの最適化の方法について説明します。次の項目が含まれます。

JDBCとマルチスレッド

Oracle JDBCドライバは、Javaマルチスレッドを使用するアプリケーションを完全にサポートし、それに対応するように最適化されています。接続キャッシュによって提供されるアクセスなど、接続に対する制御されたシリアル・アクセスが必要であり、そのようなアクセス方法をお薦めします。ただし、複数スレッド間でのデータベース接続の共有はお薦めしません。複数のスレッドが1つの接続に同時にアクセスできないようにしてください。複数のスレッドで接続を共有する必要がある場合は、規則的な使用開始/使用終了の方法を使用してください。

パフォーマンスの最適化

次の機能を使用すると、JDBCプログラムのパフォーマンスを大幅に向上させることができます。

自動コミット・モードの無効化

自動コミット・モードは、SQL操作を実行するたびに自動的にCOMMIT操作を発行するかどうかを、データベースに対して指示します。自動コミット・モードにすると、異なるバインド変数で同じ文を繰り返すような場合などに、時間と処理能力の面で大きな負荷がかかる場合があります。

デフォルトでは、新規の接続オブジェクトは自動コミット・モードが有効になります。ただし、接続オブジェクトjava.sql.Conectionまたはoracle.jdbc.OracleConnectionのどちらかのsetAutoCommitメソッドで自動コミット・モードを無効化できます。

自動コミット・モードでは、文が完了した時点または次の実行が発生した時点のうち、どちらか早い方でCOMMIT操作が発生します。ResultSetを戻す文の場合は、ResultSetの最後の行が取り出されたとき、またはResultSetがクローズしたときに文が完了します。より複雑なケースでは、1つの文で出力パラメータ値や複数の結果が返されることがあります。この場合、すべての結果および出力パラメータ値が取り出された時点でCOMMITが発生します。

setAutoCommit(false)をコールして自動コミット・モードを無効化した場合、接続オブジェクトのcommitまたはrollbackメソッドを使用して、操作のグループを手動でコミットまたはロールバックする必要があります。

次に、ドライバをロードしてデータベースに接続する例を示します。新しい接続はデフォルトで自動コミット・モードが有効になるので、この例では自動コミットを無効化する方法を示します。この例では、connConnectionオブジェクトを、stmtStatementオブジェクトを表します。

// Connect to the database
// You can put a database host name after the @ sign in the connection URL.
   OracleDataSource ods = new OracleDataSource();
   ods.setURL("jdbc:oracle:oci:@");
   ods.setUser("scott");
   ods.setPassword("tiger");
   Connection conn = ods.getConnection();

// It's faster when auto commit is off
conn.setAutoCommit (false);

// Create a Statement
Statement stmt = conn.createStatement ();
...

標準フェッチ・サイズとOracle行プリフェッチ

問合せ中に結果セットにデータが移入されるときに、データベースへの1回のラウンドトリップでクライアントにプリフェッチされる行数は、Oracle JDBCの接続オブジェクトおよび文オブジェクトで指定できます。接続オブジェクトに値を設定すると、その接続で作成される文すべてに適用できます。また、その値を特定の文オブジェクトでオーバーライドすることもできます。接続オブジェクトのデフォルト値は10です。データをクライアントにプリフェッチすると、サーバーへのラウンドトリップの回数を削減できます。

JDBC 2.0では、同様、かつさらに柔軟に、文オブジェクトにも(後続の問合せに影響)、結果セット・オブジェクトにも(行の再フェッチに影響)、1回のラウンドトリップでフェッチする行の数を指定できます。デフォルトでは、その結果セットを作成した文オブジェクトの値が、結果セットで使用されます。JDBC 2.0フェッチ・サイズを設定しないと、Oracle接続行プリフェッチ値がデフォルトとして使用されます。

標準バッチ更新とOracleバッチ更新

Oracle JDBCドライバでは、プリコンパイルされたSQL文のINSERTDELETEおよびUPDATE操作をクライアントで蓄積し、一回でサーバーに送信することができます。この機能を使用すると、サーバーとのラウンドトリップを減少できます。Oracleバッチ更新または標準バッチ更新のどちらかを使用できます。Oracleバッチ更新では、通常、あらかじめ設定されているバッチ値に達すると、暗黙的にバッチが処理されます。標準バッチ更新では、バッチは明示的に処理されます。


関連項目:

「バッチ更新」

文キャッシュ

文キャッシュにより、繰り返しコールされるループやメソッドなどで何度も使用する実行文がキャッシュされるため、パフォーマンスが向上します。アプリケーションでは、特定の物理接続に関連付けられている文をキャッシュするために文キャッシュを使用します。文キャッシュを有効にすると、closeメソッドをコールするときに文オブジェクトがキャッシュされます。物理接続ごとに独自のキャッシュがあるため、複数の物理接続に対して文キャッシュを有効にすると複数のキャッシュが存在することになります。

接続キャッシュで文キャッシュを有効にすると、基礎となる物理接続で有効な文キャッシュが論理接続で利用されます。接続キャッシュによって保持されている論理接続で文キャッシュを有効にしようとすると、例外が発生します。

組込みSQL型とJava型間のマッピング

SQLの組込み型とは、NUMBERCHARなどのシステム定義の名前が付いた型のことです。これに対して、Oracleオブジェクト、VARRAYおよびNESTED TABLE型の名前はユーザー定義です。組込みSQL型のデータにアクセスするJDBCプログラムでは、SQLデータが変換されるJava型はプログラム・コンテキストによって決定されるため、型変換はすべて明白です。

表B-1は、表11-1に示した情報のサブセットです。この表に、SQLデータベース型とそのJava oracle.sql.*表現の1対1の型マッピングを示します。

表B-1 SQLデータ型とSQLデータ型を表すJavaクラスのマッピング

SQLデータ型 ORACLEマッピング - SQLデータ型を表すJavaクラス

CHAR

oracle.sql.CHAR

VARCHAR2

oracle.sql.CHAR

DATE

oracle.sql.DATE

DECIMAL

oracle.sql.NUMBER

DOUBLE PRECISION

oracle.sql.NUMBER

FLOAT

oracle.sql.NUMBER

INTEGER

oracle.sql.NUMBER

REAL

oracle.sql.NUMBER

RAW

oracle.sql.RAW

LONG RAW

oracle.sql.RAW

REF CURSOR

java.sql.ResultSet

CLOB LOCATOR

oracle.sql.CLOB

BLOB LOCATOR

oracle.sql.BLOB

BFILE

oracle.sql.BFILE

NESTED TABLE

oracle.sql.ARRAY

VARRAY

oracle.sql.ARRAY

SQLオブジェクト値

型マップにオブジェクト値のエントリが存在しない場合:

  • oracle.sql.STRUCT

型マップにオブジェクト値のエントリが存在する場合:

  • カスタムJavaクラス

SQLオブジェクト型へのREF

oracle.sql.SQLRefを実装するクラス。通常はoracle.sql.REFを拡張します。


このマッピングを使用すると、SQLとJavaデータ表示間の変換が最も効率的に行われます。このマッピングは、通常のSQLデータ表現をバイト配列として格納します。データ形式の再設定は行われません。情報は保持されます。SQLからJava、またはJavaからSQLにデータを変換するアプリケーションの型マッピングには、このOracleマッピングが最も効率的です。

数値データにアクセスする最も効率的な方法は、intfloatlongおよびdoubleなどのプリミティブJava型としてアクセスする方法です。ただし、これらの型の範囲は、SQL NUMBERデータ型の値の範囲と正確には一致しません。このため、一部の情報が失われる可能性があります。

文字データはすべて、JavaのUCS2キャラクタ・セットに変換されます。文字データにアクセスする最も効率的な方法は、java.lang.Stringとしてアクセスする方法です。最も問題となるのは、データベース・キャラクタ・セットの2つ以上の文字が1つのUCS2キャラクタにマップされる場合に、情報が失われる可能性があることです。Oracle Database 11gでは、キャラクタ・セットのすべての文字がUCS2キャラクタ・セットの文字にマップされます。ただし、一部の文字はサロゲート・ペアにマップされます。

トランザクション分離レベルとアクセス・モード

読取り専用接続は、Oracleサーバーではサポートされていますが、Oracle JDBCドライバではサポートされていません。

トランザクションの場合、Oracleサーバーでサポートしているトランザクション分離レベルはTRANSACTION_READ_COMMITTEDおよびTRANSACTION_SERIALIZABLEのみです。デフォルトはTRANSACTION_READ_COMMITTEDです。レベルの取出しおよび設定を行うには、oracle.jdbc.OracleConnectionクラスの次のメソッドを使用します。