1

我正在尝试更新一个应用程序上的一些数据并将 JMS 事件发送到不同的 JBOSS 服务器。侦听器将获取事件并尝试使用带有 dblink 的数据库视图读取数据。

最初,此视图没有该 ID 的数据。我使用其他应用程序更新数据,并在提交 JMS 事件后使用该 ID 发送。一旦侦听器收到此 ID,它将使用数据库视图获取数据。

我的问题是,在使用 JPA/HIBERNATE 读取时,它仍在读取作为空白的旧数据。

调用dao层的服务层正在使用以下事务

    @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);

注意:它起作用的唯一方法是,在我收到事件后,如果我执行了一个staright jdbc,我可以从该视图中获取数据,但使用 spring/hibernate 配置时,它会显示为空白。

任何想法为什么它不能正常工作,为什么我需要对调用做一个staright jdbc?

4

1 回答 1

0

这看起来像是在提交发送者的事务之前接收到消息的标准场景。要使其正常工作,您需要在事务提交后发送消息。使用 spring,您可以通过以下方式执行此操作TransactionSynchornization

TransactionSynchronizationManager.registerSynchronization(new  
         MessageQueueTransactionSynchronization(jmsSender, message));

whereMessageQueueTransactionSynchronization实现并在触发TransactionSynchronization时发送消息afterCompletion(..)status = TransactionSynchronization.STATUS_COMMITTED

于 2012-12-06T06:35:31.877 回答