최대 절전 모드 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);
}
그래서 내 질문 : 어떻게 동기화되지 않은 영속 컨텍스트와 엔티티 관리자의 인스턴스를 주입하는? 엔티티 관리자를 주입 할 때 Wildfly
이 type = PersistenceContextType.EXTENDED
매개 변수를 무시하는 이유는 무엇입니까? 내가 놓친 게 있니?