2010-08-17 4 views
1

J'utilise un contexte de persistance étendue (Entitymanager injecté à SFSB) et ai également défini @TransactionManagement(value=TransactionManagementType.BEAN) pour que la SFSB ait un contrôle total sur UserTransaction.JBoss Cache Configuration

La transaction est contrôlée côté client où je lance une recherche pour les SFSB contenant une référence aux beans entité.

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(); 

qui fonctionne jusqu'à présent! Après l'activation de JBoss Cache et de plusieurs clients, seul le premier client entraîne une sélection de base de données. Les autres obtiennent l'entité du cache.

parfait!

Le problème:

2 clients (ClientA, CLIENTB) semble en même temps pour une entité ayant la même clé primaire, alors que ClientA passe par le programme, CLIENTB est arrêter manuellement après findByPrimaryKey. Lorsque CLIENTA est terminé (la valeur est conservée avec succès), le système de CLIENTB affiche l'ancienne valeur qui est modifiée et stockée dans la base de données. Donc, je perds les valeurs de CLIENTA !!

Est-ce un problème de configuration de JBoss Cache ou est-ce un problème général de la conception de mes systèmes?

config Cache pour l'entité:

@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL, region="com.culturall.pension.system.SymbolischeWerteEntity") 

config Cache dans 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"/> 

Thx pour tout conseil!

Répondre

0

Si je vous lis bien, vous avez configuré le cache pour qu'il soit transactionnel. Cela signifie par définition que les clients dans différentes transactions voient différentes versions de données; Si les données ont été modifiées dans une autre transaction, vous devez actualiser explicitement les données de la base de données (rejetant ainsi vos modifications) pour voir ces modifications.

Questions connexes