行レベル操作ごとに、データベースのロックが必要です。ロックは、トランザクションがコミットまたはロールバックされるまで保持されます。ロックは行 (BLOB チャンク) レベルで設定されます。つまり、大きなセッション状態には多数のロックが必要になります。ロックは、主ノードとミラーノードの両方の操作に必要です。したがって、1 回のBLOB 操作で、2 つの HADB ノードに同じ数のロックが割り当てられます。
テーブルの再断片化が実行される場合、HADB には追加のロックリソースが必要です。そのため、通常のユーザートランザクションが獲得できるのは、割り当てられたロックのうち半分だけです。
利用可能なロックオブジェクトが HADB ノードにない場合は、ログファイルにエラーが書き込まれます。詳細については、『Sun Java System Application Server Enterprise Edition 8.2 Error Message Reference』の第 14 章「HADB Error Messages」を参照してください。
必要なロック数を計算するには、次のパラメータを見積もります。
セッションデータを要求して HADB に保存する同時ユーザーの数 (ユーザーあたり 1 セッションレコード)
BLOB セッションの最大サイズ
持続性の範囲 (session または modified-session の場合はセッションデータの最大サイズ、modified-attribute の場合は属性の最大数)。セッションデータが変更されるたびに、setAttribute() を呼び出す必要があります。
次のように仮定します。
x を同時ユーザーの最大数とします。つまり、x 個のセッションデータレコードが HADB に存在するとします。
y をセッションサイズ (session または modified-session の場合) または属性サイズ (modified-attribute の場合) とします。
この場合、HADB に書き込まれるレコード数は次のようになります。
xy/7000 + 2x
挿入、削除、更新、読み取りなどのレコード操作では、1 つのレコードに 1 つのロックが使用されます。
ロックは、主レコードとホットスタンバイレコードの両方で保持されます。したがって、挿入、更新、および削除の操作では、1 回のトランザクションに、レコード数の 2 倍のロック数が必要です。読み取り操作では、主レコードのロックのみが必要です。再断片化と二次インデックスの作成が行われるときには、関係するテーブルのログレコードも、作成されるフラグメントレプリカに送信されます。その場合、1 回のトランザクションに、関係するレコード数の 4 倍のロック数が必要です (すべてのクエリーが、その影響を受けるテーブルに対するものと想定した場合)。
再断片化が実行される場合、設定するロック数は次のようになります。
Nlocks = 4x (y/7000 + 2) = 2xy/3500 + 2x
それ以外の場合、設定するロック数は次のようになります。
Nlocks = 2x (y/7000 + 2) = xy/3500 + 4x
デフォルト値から開始します。Application Server のログファイルで、指示されたエラーコードを持つ例外を探します。再断片化が行われていない通常の操作では、クライアントアプリケーションはロック数の半分しか使用しないこともあります。
割り当てられたロック数と使用中のロック数に関する情報を得るには、次のコマンドを使用します。
hadbm resourceinfo --locks
たとえば、このコマンドを実行したときに、次のような出力が表示されることがあります。
Node No. Avail Free Waits 0 50000 50000 na 1 50000 50000 na
Avail: 利用可能なロックの数。
Free: 使用中のロックの数。
Waits: ロックを待っていたトランザクションの数。すべてのロックが利用可能な場合は「na」 (適用外) が示されます。
ロック数を変更するには、次のコマンドを使用します。
hadbm set NumberOfLocks
hadbm を実行すると、変更を有効にするためにすべてのノードが 1 つずつ再起動されます。このコマンドの使用の詳細については、『Sun Java System Application Server Enterprise Edition 8.2 高可用性 (HA) 管理ガイド』の「HADB の設定」を参照してください。