RESOURCE_LOCAL 또는 JTA와 같은 지속성 단위?


87

다음과 같은 쿼리가 있습니다.

  1. 이 둘의 차이점은 무엇입니까?
  2. 이 두 가지가 모든 데이터베이스에서 지원됩니까?
  3. JPA TransactionManager와 JTA TransactionManager는 다릅니 까?

답변:


101

JPA 구현은 트랜잭션 자체를 관리 ( RESOURCE_LOCAL)하거나 애플리케이션 서버의 JTA 구현 에서 관리하도록 선택할 수 있습니다.

대부분의 경우 RESOURCE_LOCAL은 괜찮습니다. 이것은 기본적인 JDBC 레벨 트랜잭션을 사용합니다. 단점은 트랜잭션이 JPA 지속성 단위에 로컬이라는 것이므로 여러 지속성 단위 (또는 다른 데이터베이스)에 걸쳐있는 트랜잭션을 원하면 RESOURCE_LOCAL이 충분하지 않을 수 있습니다.

JTA는 JMS 및 JCA와 같은 시스템에서 트랜잭션을 관리하는데도 사용되지만 우리 대부분에게는 매우 이색적인 사용입니다.

JTA를 사용하려면 애플리케이션 서버에서 JTA에 대한 지원과 JDBC 드라이버의 지원이 필요합니다.


3
glassfih가 resource_local 사용을 허용하지 않는 것 같습니다. 어떻게 할 수 있습니까?
Pete_ch dec.

3
참고로 Atomikos 와 같은 타사 솔루션을 사용하여 전체 Java EE 애플리케이션 서버 없이도 JTA 기능을 사용할 수 있습니다 . 따라서 Tomcat과 같은 경량 웹 컨테이너를 사용하면서도 JTA 지원을받을 수 있습니다.
informatik01

84

다른 답변에 추가로

다음은 매우 유용한 기사 ( 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 .


8
한 가지 포인트를 추가하고 싶었습니다. Spring을 사용하는 경우 Resource_Local과 함께 @ PersistenceContext 및 EntityManager를 사용할 수 있습니다. 이 경우 Spring 컨테이너는 @ Transactional 어노테이션을 사용하여 트랜잭션을 관리 할 수 ​​있습니다.
Sam

내 프로젝트에서 transaction-type=RESOURCE_LOCAL@PersistenceContext@TransactionalSpring에 의해 관리
라비 Parekh 씨

나는 당신이 제공 한 링크 때문에 삼각형이 위를 향하고 있습니다.
Koray Tugay

@KorayTugay 죄송합니다. 무슨 삼각형인지 잘 이해하지 못했습니다.
informatik01

1
이 대답은 당신을 위해 도움이 될 수 @LinuRadu : 최대 절전 모드에서은 Session.flush ()의 사용 무엇
informatik01

18

Resource_Local 및 JTA는 트랜잭션 관리자 (트랜잭션 수행 방법)입니다. 이것은 데이터베이스의 속성이 아니라 트랜잭션 조정을 담당하는 구성 요소입니다. JPA 및 JTA 트랜잭션 관리자는 다릅니다. JPA 트랜잭션 관리자는 JPA 트랜잭션을 담당하며 JPA 트랜잭션 만 수행하는 경우 하나를 사용하려고합니다. JTA 트랜잭션 관리자는 범용 트랜잭션 관리자이며 JMS 큐와 같은 다른 리소스를 트랜잭션에 등록 할 수 있습니다. 일반적으로 Java EE 컨테이너는 EJB, JPA 엔티티 등에 대해 JTA 트랜잭션 관리자를 사용합니다.


1

resource_local 대 JTA는 로컬 트랜잭션 대 글로벌 트랜잭션에 관한 것입니다. 단일 트랜잭션으로 여러 리소스를 관리 할 수 ​​있는지에 대한 것입니다.

CMT 대 BMT는 트랜잭션을 열고 닫는 사람 (응용 프로그램 개발자 또는 응용 프로그램 서버)에 대한 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.