クライアント側のリソース要件の削減¶
Advanced Server JDBCドライバーは、SQLクエリの結果をResultSetオブジェクトとして取得します。クエリが多数の行を返す場合、バッチ化されたResultSetを使用すると次のことが行われます。
- 最初の行を取得するのにかかる時間を短縮します。
- 必要な行のみを取得して時間を節約します。
- クライアントのメモリ要件を減らします。
ResultSetオブジェクトのフェッチサイズを小さくすると、ドライバーはResultSet全体をネットワーク経由で(サーバーからクライアントに)コピーしません。代わりに、ドライバーは一度に少数の行を要求します。クライアントアプリケーションが結果セットを移動すると、ドライバはサーバーから次の行のバッチをフェッチします。
バッチ結果セットは、すべての状況で使用できるわけではありません。次の制限を順守しないと、ドライバーは静かにフォールバックしてResultSet全体を一度にフェッチします。
- クライアントアプリケーションは
autocommit無効にする必要があります。 -
Statementオブジェクトは、TYPE_FORWARD_ONLYタイプ(デフォルト)のResultSetタイプで作成する必要があります。TYPE_FORWARD_ONLY結果セットは、ResultSetを介してのみ前進できます。 - クエリは、単一のSQLステートメントで構成する必要があります。
ステートメントオブジェクトのバッチサイズの変更¶
ResultSetオブジェクトのバッチサイズを制限すると、データの取得が高速化され、クライアント側アプリケーションに必要なリソースが削減されます。リスト1.5では、バッチサイズを5行に制限したStatementオブジェクトを作成します。
リスト1.5
// Make sure autocommit is off
conn . setAutoCommit ( false );
Statement stmt = conn . createStatement ();
// Set the Batch Size .
stmt . setFetchSize ( 5 );
ResultSet rs = stmt . executeQuery ( "SELECT * FROM emp" );
while ( rs . next ())
System . out . println ( "a row was returned." );
rs . close ();
stmt . close ();
conn.setAutoCommit(false)を呼び出すと、最初の行を取得する前にサーバーがResultSet閉じないことが保証されます。 Connection準備した後、 Statementオブジェクトを作成できます。
Statement stmt = db . createStatement ();
次のコードは、クエリを実行する前にバッチサイズを5(行)に設定します。
stmt . setFetchSize ( 5 );
ResultSet rs = stmt . executeQuery ( "SELECT * FROM emp" );
各行のためResultSetオブジェクト、コールはしprintln()印刷a row was returned 。
System . out . println ( "a row was returned." );
ResultSetにはテーブルのすべての行が含まれていますが、サーバーから一度に5行しかフェッチされないことに注意してください。クライアントの観点から見ると、 batched結果セットとbatchedされていunbatched結果セットの唯一の違いは、 batchedされた結果がより短い時間で最初の行を返す可能性があることです。
次に、我々は別の機能(を見ていきますthe PreparedStatementあなたは、特定のJDBCアプリケーションのパフォーマンスを向上させるために使用することができます)。
