2016-08-09 7 views
0

최대 절전 모드 4.3.7에서 최대 절전 모드 5.0.7로 JTA 트랜잭션과 비동기 지속성 컨텍스트를 사용하는 응용 프로그램을 마이그레이션하려고하는데 몇 가지 문제점을 발견했습니다. 주위에 내 머리를 얻을 수 없습니다. 우리의 엔티티 관리자는 다음과 같이 삽입했습니다.Hibernate 5.x 및 Wildlfy USYNCHRONIZED 지속성 컨텍스트 사용

@PersistenceContext(type = PersistenceContextType.EXTENDED, synchronization = SynchronizationType.UNSYNCHRONIZED) 
private EntityManager entityManager; 

그래서 확장 된 비 동기화 지속성 컨텍스트가 있어야합니다. 응용 프로그램은 UNSYNCHRONIZED 기능을 사용하여 원하는대로 엔터티를 데이터베이스로 플러시하지 않도록합니다. 일반적으로 저장/지속/제거 작업 후에 만 ​​변경 내용을 플러시하고 이러한 메서드는 entityManager.joinTransaction(); 을 호출하여 동기화를 위해 현재 트랜잭션을 명시 적으로 표시합니다. 이것은 Hibernate 4.3.7에서 어느 정도까지는 작동하지만 버전 5에서는 멈춘다.

버전 5의 경우, Hiberante 녀석들은 특히 트랜잭션 처리 영역에서 상당히 많은 재 작성을 수행했다. 내 이해에서, 최대 절전 모드는 session.autoJoinTransactions 플래그를 사용하여 UNSYNCHRONIZED 기능을 구현합니다. 세션이 트랜잭션에 참여하지 않는 한 세션은 플러시되지 않습니다 (우리는 기본 flushMode.AUTO를 사용합니다). 이전에는이 ​​플래그는

sessionBuilder.autoJoinTransactions(getTransactionType() != PersistenceUnitTransactionType.JTA); 

로하고

sessionBuilder.autoJoinTransactions(getSynchronizationType() == SynchronizationType.SYNCHRONIZED); 

우리가 JTA가 작동하는 데 사용되는 트랜잭션을 관리 사용할 때 최대 절전 모드 5 (EntityManagetImpl 라인 132)에 새로운 세션에 대해 설정됩니다. 그러나 지금은 그렇지 않습니다. 그것은 SynchronizationType을 기반으로 autoJoinTransaction 플래그의 값을 결정하는 것 같습니다.하지만 작은 문제가 하나 있습니다. persistenceContextTyoe는 EntityFactoryImpl 메소드로 전달되지 않으므로 엔티티 관리자는 항상 synchronized로 작성됩니다. entityManager를 삽입 할 때 wildlfy는 첫 번째 메소드를 호출하고 두 번째 메소드는 호출하지 않습니다.

@Override 
    public EntityManager createEntityManager(Map map) { 
     return internalCreateEntityManager(SynchronizationType.SYNCHRONIZED, map); 
    } 

    @Override 
    public EntityManager createEntityManager(SynchronizationType synchronizationType, Map map) { 
     errorIfResourceLocalDueToExplicitSynchronizationType(); 
     return internalCreateEntityManager(synchronizationType, map); 
    } 

그래서 내 질문 : 어떻게 동기화되지 않은 영속 컨텍스트와 엔티티 관리자의 인스턴스를 주입하는? 엔티티 관리자를 주입 할 때 Wildflytype = PersistenceContextType.EXTENDED 매개 변수를 무시하는 이유는 무엇입니까? 내가 놓친 게 있니?

답변

0

동기화 된 유형이 삽입 된 enntiyManager로 전달됨에 따라 EntityManagerFactory를 사용하여 entityManger를 생성 할 수 있음을 알았습니다. 팩토리에는 동기화 유형을 승인하는 메소드가있어 비동기 컨텍스트를 작성합니다.

@PersistenceUnit 
private EntityManagerFactory emf; 
... 
emf.createEntityManager(SynchronizationType.UNSYNCHRONIZED); 

또한, 나는이 문제가 제이보스 8.1 https://issues.jboss.org/browse/WFLY-5006

에 대해 기록 발견