2010-08-17 116 views
1

我正在使用扩展的持久化上下文(在SFSB注入Entitymanager)并且为SFSB另外设置了@TransactionManagement(value=TransactionManagementType.BEAN)以完全控制UserTransactionJBoss缓存配置

交易在客户端进行控制,我开始查找包含对实体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客户端(客户端A,CLIENTB)同时查找具有相同主密钥的实体,而客户端A贯穿该程序,CLIENTB手动的findByPrimaryKey之后暂停。 当CLIENTA完成时(值被成功保存),CLIENTB的系统输出显示旧值,并被修改并存储到数据库中。

所以我失去了CLIENTA的价值!

这是一个JBoss Cache的配置问题还是这是我的系统设计的一个普遍问题?

缓存配置的实体:在persistence.xml中

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

缓存配置

<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任何意见!

回答

0

如果我读了你的话,你配置了缓存为事务性的。根据定义,这意味着不同交易中的客户会看到不同版本的数据;如果在其他事务中修改了数据,则需要明确地从数据库刷新数据(因此放弃更改)以查看这些更改。