コミットオプションは、ある EJB コンポーネントがトランザクションを完了したときに EJB コンテナによって実行されるアクションを制御します。コミットオプションはパフォーマンスに大きな影響を及ぼします。
コミットオプションで使用可能な値には次の 2 つがあります。
コミットオプション B:トランザクション完了時に、Bean はキャッシュ内に保存され、その ID を維持します。同じ主キーに対する次の呼び出しは、このキャッシュ内のインスタンスを使用できます。EJB コンテナは、データベースとの同期メソッドを呼び出す前に、Bean の ejbLoad() メソッドを呼び出します。
コミットオプション C:トランザクション完了時に、EJB コンテナは Bean の ejbPassivate() メソッドを呼び出します。Bean はその主キーとの関連付けを解除され、未使用プールへと戻されます。同じ主キーに対する次の呼び出しは、プールから未使用 Bean を取得し、そのインスタンスに PrimaryKey を設定したあと、そのインスタンス上で ejbActivate() を呼び出します。この場合も、EJB コンテナは、データベースとの同期メソッドを呼び出す前に、Bean の ejbLoad() メソッドを呼び出します。
オプション B では、ejbAcivate() と ejbPassivate() の呼び出しを避けられます。このため、ほとんどの場合、オプション C の場合よりもパフォーマンスが良くなります。なぜなら、プールからオブジェクトを取得したりオブジェクトを解放してプールに戻したりするオーバーヘッドの一部を回避できるからです。
ただし、オプション C のほうがパフォーマンスが良くなる場合もあります。キャッシュ内の Beans がほとんど再利用されず、Beans が継続的にキャッシュに追加されるようであれば、Beans をキャッシュに書き込む意味がありません。オプション C が使用される場合、コンテナは、メソッド呼び出し後やトランザクション完了時に、Beans をキャッシュに書き込む代わりにプールに戻します。このオプションでは、インスタンスの再利用がより効率的に行われるほか、JVM 内のライブオブジェクトの数が減少するのでガベージコレクションの高速化も図れます。
コミットオプション B、コミットオプション C のどちらを使用すべきかを決定するには、まず、Bean の監視コマンドを使ってキャッシュヒット数を調べます。キャッシュヒット数がキャッシュミス数を大幅に上回っている場合は、オプション B が適切な選択肢となります。最良の結果を得るためには、さらに max-cache-size と cache-resize-quantity を変更する必要がある可能性もあります。
キャッシュヒット数が極めて低く、かつキャッシュミス数が非常に多い場合、アプリケーションが Bean インスタンスを再利用できていないので、max-cache-size を使ってキャッシュサイズを増やしても効果はありません (アクセスパターンが同じままであると仮定した場合)。この場合はコミットオプション C を使用することができます。キャッシュヒット数とキャッシュミス数にあまり大きな違いがない場合には、max-cache-size をチューニングし、場合によっては cache-idle-timeout-in-seconds もチューニングしてください。