私は拡張持続性コンテキスト (SFSB に注入された Entitymanager) を使用しており、さらに@TransactionManagement(value=TransactionManagementType.BEAN)
SFSB が を完全に制御できるように設定していUserTransaction
ます。
トランザクションは、エンティティ Bean への参照を含む SFSB のルックアップを開始するクライアント側で制御されます。
SymbolischeWerte sbw = (SymbolischeWerte)symbolischeWerteHome.findByPrimaryKey(BigDecimal.valueOf(24704578762l));
System.out.println(symbolischeWerteHome.getSEQ_ID() + "\t\t" + symbolischeWerteHome.getName());
symbolischeWerteHome.beginTransaction();
symbolischeWerteHome.setName(symbolischeWerteHome.getName().concat("A"));
symbolischeWerteHome.commitTransaction();
それはこれまでのところうまくいきます!
JBoss Cache と複数のクライアントを有効にした後、最初のクライアントのみがデータベースの選択を引き起こします。他の人はキャッシュからエンティティを取得します。
完全!
問題:
2 つのクライアント (CLIENTA、CLIENTB) が同時に同じ主キーを持つエンティティを検索します。CLIENTA がプログラムを実行している間、CLIENTB は findByPrimaryKey の後で手動で停止します。CLIENTA が終了すると (値が正常に永続化されます)、CLIENTB のシステム出力は、変更されてデータベースにも格納された古い値を表示します。
だから私はCLIENTAの価値観を失っています!!
これは JBoss Cache 設定の問題ですか、それともシステム設計の一般的な問題ですか?
エンティティのキャッシュ構成:
@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL, region="com.culturall.pension.system.SymbolischeWerteEntity")
persistence.xml に構成をキャッシュする
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.jbc2.JndiMultiplexedJBossCacheRegionFactory"/>
<property name="hibernate.cache.region.jbc2.cachefactory" value="java:CacheManager"/>
<property name="hibernate.cache.region.jbc2.cfg.entity" value="mvcc-entity"/>
<property name="hibernate.cache.region.jbc2.cfg.query" value="local-query"/>
どんなアドバイスもありがとう!