4 SODAコレクションのメタデータ・キャッシング

SODAコレクション・メタデータは、コレクション・データと同様にデータベース内に永続的に格納されます。必要に応じて、透過的にフェッチされコレクション操作を実行します。データベースからメタデータをフェッチすると、パフォーマンス上のコストが発生します。クライアントでコレクション・メタデータをキャッシュして、メタデータを取得するためのデータベース・アクセスを回避することにより、パフォーマンスを改善できます。

コレクション・メタデータのキャッシングを使用する主な事例は次のとおりです。

  • 既存のコレクションをリストし、リストされた1つ以上のコレクションをオープンする。

  • コレクションを作成してから、これをオープンする。

  • コレクションを再度オープンする。

これらのすべての事例において、キャッシュされたメタデータを使用してコレクションをオープンできます。

コレクション・メタデータのキャッシュは、特定のOracleRDBMSClientオブジェクトから取得されるすべてのOracleDatabaseオブジェクトで共有することも、単一のOracleDatabaseオブジェクトに対してローカルにすることもできます。両方の種類のキャッシングがデフォルトでは無効になっています。

ローカルと共有の両方のキャッシュが同じOracleDatabaseオブジェクトで有効になっている場合、エントリでは次のようにプロセスを参照します。

  1. ローカル・キャッシュは、データベース・オブジェクトで使用される特定のコレクションに関するエントリに対してチェックされます。

  2. ローカル・キャッシュで見つからない場合、共有キャッシュがコレクションのエントリに対してチェックされます。

  3. コレクションのエントリがキャッシュに見つからない場合、データベースにアクセスしてそのメタデータを取得しようとします。

コレクション・メタデータ・キャッシングの有効化

コレクション・メタデータ・キャッシングはデフォルトでは無効になっています。コンストラクタOracleRDBMSClient(Properties props)を使用して、共有またはローカル・コレクション・メタデータ・キャッシングを有効にできます。

ここで、パラメータpropsは、次のプロパティの1つまたは両方で初期化するPropertiesインスタンスです。

  • 値が"true"のプロパティoracle.soda.sharedMetadataCache: 共有キャッシュを有効にします

  • 値が"true"のプロパティoracle.soda.localMetadataCache: ローカル・キャッシュを有効にします

例4-1に、これを示します。共有キャッシングとローカル・キャッシングの両方を有効にします。

例4-1 コレクション・メタデータ・キャッシングの有効化

Properties props = new Properties();
props.put("oracle.soda.sharedMetadataCache", "true");
props.put("oracle.soda.localMetadataCache", "true");
OracleRDBMSClient cl = new OracleRDBMSClient(props);

コレクション・メタデータの共有キャッシュ

各SODAクライアント(OracleRDBMSClientオブジェクト)は、そのクライアントから作成されたすべてのOracleDatabaseオブジェクトに作成されたすべてのコレクション(OracleCollectionオブジェクト)のメタデータを記録するコレクション・メタデータ・キャッシュに、任意に関連付けられています。関連付けられているクライアントが解放されたときに、キャッシュが解放されます。

共有キャッシュのエントリ数は10,000エントリ(スキーマごとに100データベース・スキーマ×100コレクション)に制限されています。共有キャッシュは最も長い間使用されていない(LRU)置換ポリシーを使用します。最も長い間使用されていないエントリは、キャッシュがいっぱいのとき(エントリが10,000個あるとき)新規エントリの追加により置き換えられます。

共有メタデータのキャッシュは、アクセスの競合を回避するためにロックが必要です。並行処理を制限しているためにパフォーマンスに悪影響を及ぼす可能性があります。

ローカル・コレクション・メタデータ・キャッシュ

OracleDatabaseオブジェクトは、ローカル・コレクション・メタデータ・キャッシュに任意で関連付けられています。これは、OracleDatabaseオブジェクトに作成されたコレクションのメタデータのみを記録します。関連付けられているOracleDatabaseオブジェクトが解放されると、ローカル・キャッシュが解放されます。

ローカル・キャッシュのエントリ数には制限がなく、エントリが削除されることはありません。エントリ数は、新しいコレクションが特定のデータベース・オブジェクトに作成されると増加し続けます。

ローカル・メタデータ・キャッシュに削除ポリシーがないということは、キャッシュされたコレクション・メタデータは常に使用可能であり、メタデータがキャッシュされると、これを取得するためにデータベースにアクセスする必要がないということです。

ローカル・キャッシングには共有がないため、同じコレクションへのアクセスに異なるデータベース・オブジェクトを使用すると、共有キャッシングの場合よりもラウンド・トリップおよびデータ・レプリケーションが増加します。

共有メタデータ・キャッシュと異なり、ローカル・キャッシュではロックが必要ありません。

注意:

ローカル・キャッシュのエントリ数には制限がないので、特定のOracle Databaseオブジェクトを使用して多数のコレクションを作成する場合にはローカル・キャッシュの使用をお薦めしません。メモリーが不足する可能性があるためです。