Cosminexus 機能解説

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

9.10.8 受信バッファのプーリング(Cosminexus DABroker Libraryを使用する場合)

Cosminexus DABroker Libraryを使用する場合,実行したSQLに対して返却される実行結果を格納する領域をプールして再利用できます。この領域を受信バッファといいます。また,受信バッファをプールするための領域を受信バッファプールといいます。受信バッファをプールすることによって,SQL実行時に受信バッファが頻繁に作成,破棄されることで発生する負荷を削減できます。

また,プールする受信バッファの数を指定できるため,ステートメントプーリング使用時のメモリ占有量を抑制できます。

ここでは,受信バッファの管理と,受信バッファプール数の指定について説明します。

<この項の構成>
(1) 受信バッファの管理
(2) 受信バッファプール数の指定

(1) 受信バッファの管理

受信バッファの管理では,プールする受信バッファ数を指定する場合と指定しない場合とで,受信バッファの再利用のしかたが異なります。ここでは,プールする受信バッファ数を指定しない,デフォルトの場合について説明します。受信バッファ数を指定する場合については,「(2) 受信バッファプール数の指定」を参照してください。

受信バッファは,Statementごとに受信バッファプールに生成されます。生成された受信バッファはセクションIDで管理され,同一のStatementで再利用されます。なお,ここでは,Statement,PreparedStatement,およびCallableStatementをStatementと総称します。

受信バッファプールの管理の概要を次の図に示します。

図9-19 受信バッファプールの管理の概要(受信バッファプール数を指定しない場合)

[図データ]

受信バッファが生成されるタイミング
Statementの受信バッファはデータベースとの接続時に一つ生成され,そのセクションIDは「1」になります。これ以降はSQL実行時に受信バッファが生成されます。受信バッファが生成されると,受信バッファプールに登録されます。

受信バッファの保持期間
受信バッファプールに登録された受信バッファは,コネクションがクローズされるまで保持されます。ステートメントをクローズしても,受信バッファは破棄されません。

プールする受信バッファの数
プールできる受信バッファの数は,最大1,024個です。

SQLを実行するメソッド
次のメソッドを実行するとSQLが実行され,受信バッファが生成されます。

表9-34 SQLを実行するメソッド

クラス メソッド
Connection prepareCall(String sql)
prepareCall(String sql, int resultSetType, int resultSetConcurrency)
prepareStatement(String sql)
prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
DatabaseMetaData getProcedures(String catalog, String schemaPattern, String procedureNamePattern)
getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern)
getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types)
getSchemas()
getTableTypes()
getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)
getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern)
getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern)
getPrimaryKeys(String catalog, String schema, String table)
getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate)
Statement executeBatch()
execute(String sql)
executeQuery(String sql)
executeUpdate(String sql)
PreparedStatement execute()
executeQuery()
executeUpdate()

(2) 受信バッファプール数の指定

受信バッファプールに登録してプールする受信バッファの数を指定できます。この数のことを受信バッファプール数といいます。受信バッファプール数を指定することによってSQL実行時の性能を向上でき,メモリ占有量を軽減できます。

受信バッファプール数は,1〜1,024個の範囲で指定できます。受信バッファプール数を指定すると,同一コネクション内で受信バッファが再利用されます。そのため,セッションIDが異なるStatementでも,同一コネクションであれば受信バッファを再利用できます。受信バッファが,指定した受信バッファプール数よりも多く必要になった場合は,一時的に受信バッファを生成し,Cosminexus DABroker Libraryから実行結果のデータを受信したあとに破棄します。このような一時的に生成した受信バッファは,受信バッファプールには登録されません。

受信バッファプール数を指定した場合の,受信バッファプールの管理の概要を次の図に示します。

図9-20 受信バッファプールの管理の概要(受信バッファプール数を指定した場合)

[図データ]

受信バッファが生成されるタイミング
受信バッファが生成されるタイミングは,受信バッファプール数を指定しない場合と同じです。詳細については,「(1) 受信バッファの管理」を参照してください。

受信バッファを取得または返却するタイミング
受信バッファプールから受信バッファを取得するタイミング,および受信バッファを受信バッファプールに返却するタイミングは,SQLを実行するメソッドによって異なります。
各メソッドの動作は次の三つに分類されます。

表9-35 メソッドの動作の分類

動作 説明
1 メソッド実行時に受信バッファを受信バッファプールから取得する。メソッド終了後,受信バッファを受信バッファプールに戻す。
2 動作2に分類されるメソッドのうち,最初に実行するメソッドで受信バッファを受信バッファプールから取得する。メソッドが終了しても,受信バッファは受信バッファプールに戻さない。
3 動作2に分類されるメソッドで取得した受信バッファを受信バッファプールに戻す。新たな受信バッファは取得しない。
受信バッファを再利用する際に受信バッファを取得または返却するメソッド,およびメソッドの動作を次の表に示します。動作の列の数字は,上記の表と対応しています。

表9-36 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

注※ ResultSet#close()メソッドを実行していない場合だけ使用できます。


(a) 受信バッファプール数の指定方法

受信バッファプール数は,次のどれかの方法で指定します。また,これらを同時に指定した場合,1,2,3の優先度順に決定されます。

  1. DataSource#setBufferPoolSize()メソッドで指定する。
  2. 接続するデータベースの設定で,getConnectionメソッドおよびconnectメソッドの引数Properties infoに,キーワード「BUF_POOL_SIZE」を指定する。
  3. データベースの各種情報の設定で,引数URLに「BUF_POOL_SIZE」を指定する。

指定方法の詳細については,「付録I.4 データベース接続の設定」を参照してください。

(b) 受信バッファプール数の目安

受信バッファプール数は,次の式で求められる数以上の数を目安に設定します。

検索処理に必要な受信バッファ数+更新処理に必要な受信バッファ数

検索処理に必要な受信バッファ数
アプリケーションの中で同時に使用するResultSetの数です。
実行するStatementが4個のアプリケーションの場合の,ResultSetの数の例を次の図に示します。

図9-21 アプリケーション中で同時に使用するResultSetの数

[図データ]
この図の場合,アプリケーションの開始から終了までの間に同時に使用するResultSetの数は3のため,検索処理に必要な受信バッファ数は3となります。

更新処理に必要な受信バッファ数
次のどちらかで求めます。
  • 更新処理を単一スレッドで逐次実行する場合は,1
  • 更新処理をマルチスレッドで同時実行する場合は,アプリケーションの中で同時実行する更新SQLの数

実際に必要な受信バッファ数が,この式を基に設定した受信バッファ数を超えた場合,受信バッファを新たに生成し,使用後に破棄します。このとき,生成した受信バッファは受信バッファプールに登録されません。この場合,オブジェクトの作成,破棄が頻発するため,性能が劣化することがあります。ただし,設定した受信バッファ数を超えた分の受信バッファは使用後に破棄するため,式を基に設定した場合よりメモリ占有量は軽減します。