18.5.2 受信バッファプール数の指定
受信バッファプールに登録してプールする受信バッファの数を指定できます。この数のことを受信バッファプール数といいます。受信バッファプール数を指定することによってSQL実行時の性能を向上でき,メモリ占有量を軽減できます。
受信バッファプール数は,1〜1,024個の範囲で指定できます。受信バッファプール数を指定すると,同一コネクション内で受信バッファが再利用されます。そのため,セッションIDが異なるStatementでも,同一コネクションであれば受信バッファを再利用できます。受信バッファが,指定した受信バッファプール数よりも多く必要になった場合は,一時的に受信バッファを生成し,DABroker Libraryから実行結果のデータを受信したあとに破棄します。このような一時的に生成した受信バッファは,受信バッファプールには登録されません。
受信バッファプール数を指定した場合の,受信バッファプールの管理の概要を次の図に示します。
- 受信バッファが生成されるタイミング
-
受信バッファが生成されるタイミングは,受信バッファプール数を指定しない場合と同じです。詳細については,「18.5.1 受信バッファの管理」を参照してください。
- 受信バッファを取得または返却するタイミング
-
受信バッファプールから受信バッファを取得するタイミング,および受信バッファを受信バッファプールに返却するタイミングは,SQLを実行するメソッドによって異なります。
各メソッドの動作は次の三つに分類されます。
表18‒17 メソッドの動作の分類 動作
説明
1
メソッド実行時に受信バッファを受信バッファプールから取得する。メソッド終了後,受信バッファを受信バッファプールに戻す。
2
動作2に分類されるメソッドのうち,最初に実行するメソッドで受信バッファを受信バッファプールから取得する。メソッドが終了しても,受信バッファは受信バッファプールに戻さない。
3
動作2に分類されるメソッドで取得した受信バッファを受信バッファプールに戻す。新たな受信バッファは取得しない。
受信バッファを再利用する際に受信バッファを取得または返却するメソッド,およびメソッドの動作を次の表に示します。動作の列の数字は,上記の表と対応しています。
表18‒18 SQLを実行するメソッド,およびメソッドの動作 クラス
メソッド
動作
Connection
prepareCall(String sql)
1
prepareCall(String sql, int resultSetType, int resultSetConcurrency)
1
prepareStatement(String sql)
1
prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
1
DatabaseMetaData
getProcedures(String catalog, String schemaPattern, String procedureNamePattern)
1
getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern)
1
getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types)
1
getSchemas()
1
getTableTypes()
1
getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)
1
getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern)
1
getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern)
1
getPrimaryKeys(String catalog, String schema, String table)
1
getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate)
1
Statement
executeBatch()
1
execute(String sql)
1
executeQuery(String sql)
1
executeUpdate(String sql)
1
close()※
3
PreparedStatement
execute()
1
executeQuery()
1
executeUpdate()
1
ResultSet
absolute(int row)
2
afterLast()
2
first()
2
next()
2
close()
3
- 〈この項の構成〉
(1) 受信バッファプール数の指定方法
受信バッファプール数は,次のどれかの方法で指定します。また,これらを同時に指定した場合,1,2,3の優先度順に決定されます。
-
DataSource#setBufferPoolSize()メソッドで指定する。
-
接続するデータベースの設定で,getConnectionメソッドおよびconnectメソッドの引数Properties infoに,キーワード「BUF_POOL_SIZE」を指定する。
-
データベースの各種情報の設定で,引数URLに「BUF_POOL_SIZE」を指定する。
指定方法の詳細については,「18.7.4 データベース接続の設定」を参照してください。
(2) 受信バッファプール数の目安
受信バッファプール数は,次の式で求められる数以上の数を目安に設定します。
検索処理に必要な受信バッファ数+更新処理に必要な受信バッファ数
- 検索処理に必要な受信バッファ数
-
アプリケーションの中で同時に使用するResultSetの数です。
実行するStatementが4個のアプリケーションの場合の,ResultSetの数の例を次の図に示します。
図18‒3 アプリケーション中で同時に使用するResultSetの数 この図の場合,アプリケーションの開始から終了までの間に同時に使用するResultSetの数は3のため,検索処理に必要な受信バッファ数は3となります。
- 更新処理に必要な受信バッファ数
-
次のどちらかで求めます。
-
更新処理を単一スレッドで逐次実行する場合は,1
-
更新処理をマルチスレッドで同時実行する場合は,アプリケーションの中で同時実行する更新SQLの数
-
実際に必要な受信バッファ数が,この式を基に設定した受信バッファ数を超えた場合,受信バッファを新たに生成し,使用後に破棄します。このとき,生成した受信バッファは受信バッファプールに登録されません。この場合,オブジェクトの作成,破棄が頻発するため,性能が劣化することがあります。ただし,設定した受信バッファ数を超えた分の受信バッファは使用後に破棄するため,式を基に設定した場合よりメモリ占有量は軽減します。