1

ある APPlication でいくつかのデータを更新し、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);

注:それが機能する唯一の方法は、イベントを受け取った後、スターライトjdbcを実行すると、そのビューからデータを取得できますが、Spring / Hibernate構成では空白になります。

通常の動作で機能しない理由と、呼び出しに対してスターライト jdbc を実行する必要があるのはなぜですか?

4

1 に答える 1

0

これは、送信者のトランザクションがコミットされる前にメッセージが受信される標準的なシナリオのように見えます。機能させるには、トランザクションがコミットされた後にメッセージを送信する必要があります。春を使用すると、次の方法でそれを行うことができますTransactionSynchornization

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

whereは、でトリガーされたときにメッセージをMessageQueueTransactionSynchronization実装して送信しますTransactionSynchronizationafterCompletion(..)status = TransactionSynchronization.STATUS_COMMITTED

于 2012-12-06T06:35:31.877 に答える