2016-07-05 4 views
0

infinispan의 singleton 인스턴스를 얻을 수 있으므로 캐시 레벨이 아닌 인스턴스 레벨에서 XA 리소스를 가져 와서 진행중인 JTA 트랜잭션에 참여하십시오 ..!인스턴스 레벨에서 Jta infinispan

ConfigurationBuilder builder = new ConfigurationBuilder(); 
        builder.transaction().transactionMode(TransactionMode.TRANSACTIONAL); 
        builder.jmxStatistics().enable(); 
        //builder.jmxStatistics() 
        // Construct a local cache manager using the configuration we have defined 
        DefaultCacheManager cacheManager = new DefaultCacheManager(builder.build()); 

위의 내용은 jta에서 자동으로 가정합니다.

또는 내가 사용해야합니까,

GenericTransactionLookup.init() ...!? 누군가가 Infinispan에서 그것을 이해하도록 도와주세요 ...!

답변

2

캐시를 만들면 트랜잭션 관리자에 아무것도 등록되지 않습니다. 주제에서 벗어나 코드가 캐시 관리자 만 생성하고 기본 캐시는 getCache()을 호출 할 때만 시작되며 구성의 다른 모든 캐시에도 동일하게 적용됩니다.

트랜잭션 캐시는 캐시 작업을 호출 할 때마다 XAResource 인스턴스를 새로 등록하고 실행중인 JTA 트랜잭션을 감지합니다. 만약 을 (GenericTransactionManagerLookup 경유로) 탐지했지만 실행중인 트랜잭션이 없다면, 먼저 JTA 트랜잭션을 생성하고, 연산을 실행하고, JTA 트랜잭션을 커밋한다. (읽기 작업 제외)

Infinispan에서 XAResource을 가져 와서 JTA 트랜잭션을 수동으로 등록 할 수 없습니다. cache.getAdvancedCache().getXAResource()으로 XAResource을 얻을 수 있지만 에만 만 사용하면 복구 할 수 있습니다.

+0

어떤 의미인지, 어떤 캐시가 있어야하는지, 한 번 구성되지 않았는지를 결정할 수 없습니다. BTW 어떻게 트랜잭션에 참여했는지 확인하는 방법 ...! – peaceUser

+0

문서에 따르면, 그것은 jta 트랜잭션을 감지합니다. 실제로 나는 infinispan 측면에서 그 어떤 로그도 식별 할 수 없습니다. 때때로 캐시는 jta가 null jta를 얻는 것을 식별하지 못합니다 .. !! – peaceUser

+0

기존 트랜잭션에서 캐시를 등록하는 것을 피할 수 있지만, 그 후에는 전에 TransactionManager.suspend()를 호출하고 그 전에는 TM.resume()을 호출해야합니다. –