10.2.2. オブジェクトストア
JBoss Transaction Service が提供するオブジェクトストアには制限のかなりあるインターフェースが存在するため、様々な方法で実装可能です。例えば、オブジェクトストアは、ローカルファイルシステムでも、リモートのデータベースでも、共有メモリでも常駐可能です。JBoss Transaction Service で提供されているオブジェクトストアに関する詳細情報は、添付資料にて確認できます。
注記
すべてのJBoss Transaction Service クラスについては、デフォルトのオブジェクトストアは pure Java 実装となっています。ネーティブのメソッドを使い共有メモリやより複雑な他のオブジェクトストア実装にアクセスする必要があります。
オブジェクトストアはすべて、
InputObjectState
と OutputObjectState
クラスのインスタンスを保持、リトリーブします。これらのインスタンスは、それらが表すオブジェクトのUid とタイプにより名前が付けられます。read_committed
メソッドを使い状態を読み取り、write_uncommitted
メソッドを使いステートを書き込みます。通常、新規オブジェクトステートは、古いオブジェクトステートを上書きせず、シャドーコピーとしてストアに書き込まれます。commit_state
メソッドが呼び出されたときにのみ、これらのシャドーは元のステートを置き換えます。オブジェクトストアとのやりとりはすべて、JBoss Transaction Service システムのコンポーネントにより適時実行され、オブジェクトのシャドーコピーの存在についてプログラマからは分からないようになっています。
public class ObjectStore { public static final int OS_COMMITTED; public static final int OS_UNCOMMITTED; public static final int OS_COMMITTED_HIDDEN; public static final int OS_UNCOMMITTED_HIDDEN; public static final int OS_UNKNOWN; /* The abstract interface */ public abstract boolean commit_state (Uid u, String name) throws ObjectStoreException; public abstract InputObjectState read_committed (Uid u, String name) throws ObjectStoreException; public abstract boolean write_uncommitted (Uid u, String name, OutputObjectState os) throws ObjectStoreException; . . . };
トランザクショナルオブジェクトのコミット中は、障害発生時にリカバリーし、ロールバックするか、そのままコミットするかできるように特定のステート変更を永続化する必要があります。Transactional Objects for Java を使用している場合、JBoss Transaction Service はこの永続性を自動管理します。ACID プロパティを確保するため、トランザクションのコミット前にこれらのステート変更は永続ストア実装にフラッシュされます。そうでなければ、アプリケーションは、システム障害が発生しやすいオペレーティングシステムのキャッシュにステートの変化が存在している可能性があるにも拘らず、トランザクションがコミットされているとみなします。デフォルトでは、JBoss Transaction Service はこのようなステートの変化をフラッシュします。結果、この動作によりアプリケーションのパフォーマンスに大きなペナルティを課す可能性があります。トランザクショナルオブジェクトのステートをフラッシュしないようにするには、
com.arjuna.ats.arjuna.objectstore.objectStoreSync
変数をOFFに設定します。