JBoss缓存配置

时间:2010-08-17 14:37:32

标签: java hibernate concurrency jboss-cache

我正在使用扩展持久化上下文(在SFSB注入Entitymanager),并为SFSB另外设置@TransactionManagement(value=TransactionManagementType.BEAN)以完全控制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"/>

对于任何建议感谢!

1 个答案:

答案 0 :(得分:0)

如果我读了你,你将缓存配置为事务性的。这个定义意味着不同事务中的客户端看到不同版本的数据;如果在其他事务中修改了数据,则需要明确刷新DB中的数据(从而丢弃您的更改)以查看这些更改。