Я использую расширенный контекст постоянства (внедренный Entitymanager в SFSB) и дополнительно установил @TransactionManagement(value=TransactionManagementType.BEAN)
, чтобы SFSB имел полный контроль над UserTransaction
.
Транзакция контролируется на стороне клиента, где я запускаю поиск 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 отображает старое значение, которое также изменяется и сохраняется в базе данных.
Так что я теряю ценности КЛИЕНТЫ !!
Это проблема конфигурации 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"/>
Спасибо за ЛЮБОЙ совет!