1

私は拡張持続性コンテキスト (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"/>

どんなアドバイスもありがとう!

4

1 に答える 1

0

私が正しく読んだ場合、キャッシュをトランザクション対応に構成しました。これは定義上、異なるトランザクションのクライアントが異なるバージョンのデータを参照することを意味します。データが他のトランザクションで変更された場合、それらの変更を確認するには、DB から明示的にデータを更新する (変更を破棄する) 必要があります。

于 2011-12-28T10:17:37.447 に答える