我正在尝试更新一个APPlication上的一些数据并将JMS事件发送到不同的JBOSS服务器。 侦听器将获取事件并尝试使用dblink的数据库视图读取数据。
最初,此视图没有该ID的数据。我使用其他应用程序更新数据,并在使用该ID发送JMS事件后发送。一旦侦听器收到此id,它将使用数据库视图获取数据。
我的问题是,在使用JPA / HIBERNATE阅读时,它仍然在读取空白的旧数据。
调用dao层的服务层使用以下transcation
@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
The DAO Layer is using
@PersistenceContext
private EntityManager em;
Query query = em.createNativeQuery(sbQuery.toString());
我尝试了以下所有选项,它似乎没有用。
em.clear();
em.getEntityManagerFactory().getCache().evictAll();
em.flush();
query.setHint("javax.persistence.cache.storeMode", CacheStoreMode.BYPASS);
注意:唯一可行的方法是,在我收到事件后,如果我做了一个星际jdbc,我可以从该视图中获取数据,但是使用spring / hibernate配置它会变为空白。
有任何想法为什么它不能正常行为,为什么我需要在电话中做一个星际jdbc?
答案 0 :(得分:0)
这看起来像是在提交发件人的事务之前收到邮件的标准方案。要使其工作,您需要在提交事务后发送消息。有了春天,你可以通过TransactionSynchornization
:
TransactionSynchronizationManager.registerSynchronization(new
MessageQueueTransactionSynchronization(jmsSender, message));
其中MessageQueueTransactionSynchronization
实施TransactionSynchronization
并在使用afterCompletion(..)
status = TransactionSynchronization.STATUS_COMMITTED
时发送消息