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

如果我没看错,您将缓存配置为事务性的。根据定义,这意味着不同事务中的客户端会看到不同版本的数据;如果数据在其他事务中被修改,您需要从数据库中显式刷新数据(从而丢弃您的更改)以查看这些更改。

于 2011-12-28T10:17:37.447 回答