다음과 같은 쿼리가 있습니다.
- 이 둘의 차이점은 무엇입니까?
- 이 두 가지가 모든 데이터베이스에서 지원됩니까?
- JPA TransactionManager와 JTA TransactionManager는 다릅니 까?
답변:
JPA 구현은 트랜잭션 자체를 관리 ( RESOURCE_LOCAL
)하거나 애플리케이션 서버의 JTA 구현 에서 관리하도록 선택할 수 있습니다.
대부분의 경우 RESOURCE_LOCAL은 괜찮습니다. 이것은 기본적인 JDBC 레벨 트랜잭션을 사용합니다. 단점은 트랜잭션이 JPA 지속성 단위에 로컬이라는 것이므로 여러 지속성 단위 (또는 다른 데이터베이스)에 걸쳐있는 트랜잭션을 원하면 RESOURCE_LOCAL이 충분하지 않을 수 있습니다.
JTA는 JMS 및 JCA와 같은 시스템에서 트랜잭션을 관리하는데도 사용되지만 우리 대부분에게는 매우 이색적인 사용입니다.
JTA를 사용하려면 애플리케이션 서버에서 JTA에 대한 지원과 JDBC 드라이버의 지원이 필요합니다.
다른 답변에 추가로
다음은 매우 유용한 기사 ( Apache TomEE 웹 사이트 에 게시 됨)에서 발췌 한 것으로 OP의 첫 번째 질문에 대한 답변도 도움이 될 수 있습니다 (기사 링크는 아래 참조).
RESOURCE_LOCAL 및 JTA 지속성 컨텍스트 비교
와 <지속성 단위 트랜잭션 유형 = "RESOURCE_LOCAL"> 당신은 EntityManager의 (PersistenceContext / 캐시) 생성 및 추적에 대한 책임이 있습니다 ...
- 당신은 해야한다 사용 의 EntityManagerFactory를 EntityManager에를 얻을 수
- 결과 EntityManager 인스턴스 는 PersistenceContext / Cache입니다.
- 의 EntityManagerFactory는 비아를 주입 할 수 @PersistenceUnit의 주석 만 (되지 @PersistenceContext)
- @PersistenceContext를 사용하여 RESOURCE_LOCAL 유형의 단위를 참조 할 수 없습니다.
- 당신은 해야한다 사용 EntityTransaction의 시작 / 주위 커밋 API를 모든 사용자 EntityManger에 전화를
- entityManagerFactory.createEntityManager ()를 두 번 호출하면 두 개의 개별 EntityManager 인스턴스가 생성되고 이에 대해 두 개의 개별 PersistenceContexts / Cache가 생성됩니다.
- EntityManager 인스턴스 를 두 개 이상 사용하는 것은 거의 좋은 생각 이 아닙니다 (첫 번째 인스턴스 를 삭제하지 않는 한 두 번째 인스턴스 를 만들지 마십시오).
함께 <지속성 단위 트랜잭션 타입 = "JTA"> 용기 의 EntityManager (PersistenceContext / 캐시)을 생성하고 추적 할 것이다 ..
- 당신은 할 수없는 사용 의 EntityManagerFactory를 EntityManager에를 얻을 수
- 컨테이너에서 제공 하는 EntityManager 만 가져올 수 있습니다.
- 의 EntityManager는 비아를 주입 할 수 @PersistenceContext의 주석 만 (@PersistenceUnit 생략)
- @PersistenceUnit을 사용하여 JTA 유형의 단위를 참조 할 수 없습니다.
- EntityManager의 컨테이너가 지정된는 인 기준 JTA 트랜잭션과 연관된 PersistenceContext / 캐시한다.
- 진행중인 JTA 트랜잭션 이 없으면 PersistenceContext / Cache가 없기 때문에 EntityManager를 사용할 수 없습니다 .
- 동일한 트랜잭션 의 동일한 단위 에 대한 EntityManager 참조가있는 모든 사람 은 자동으로 동일한 PersistenceContext / Cache에 대한 참조를 갖게됩니다.
- PersistenceContext / Cache는 JTA 커밋 시 비워 지고 지워집니다.
Java Persistence API를 배우는 데 관심이있는 사람은 자신에게 호의를 베풀고 여기에서 전체 기사를 읽으십시오. JPA 개념 : JPA 101 .
transaction-type=RESOURCE_LOCAL
와 @PersistenceContext
와 @Transactional
Spring에 의해 관리
Resource_Local 및 JTA는 트랜잭션 관리자 (트랜잭션 수행 방법)입니다. 이것은 데이터베이스의 속성이 아니라 트랜잭션 조정을 담당하는 구성 요소입니다. JPA 및 JTA 트랜잭션 관리자는 다릅니다. JPA 트랜잭션 관리자는 JPA 트랜잭션을 담당하며 JPA 트랜잭션 만 수행하는 경우 하나를 사용하려고합니다. JTA 트랜잭션 관리자는 범용 트랜잭션 관리자이며 JMS 큐와 같은 다른 리소스를 트랜잭션에 등록 할 수 있습니다. 일반적으로 Java EE 컨테이너는 EJB, JPA 엔티티 등에 대해 JTA 트랜잭션 관리자를 사용합니다.