복붙노트

[SPRING] EntityManager 대 삽입 EntityManagerFactory

SPRING

EntityManager 대 삽입 EntityManagerFactory

긴 질문은 제발 참아주십시오.

우리는 웹 애플리케이션에 Spring + JPA를 사용하고 있습니다. 우리 팀은 EntityManager를 주입하는 것보다 GenericDAO (GenericDAO 기반의 DAO, APPFUSE에서 제공하는 줄에 뭔가를 기반으로 JpaDaosupport를 사용하지 않음)에 EntityManagerFactory를 주입하는 것에 대해 토론하고 있습니다. 우리는 "응용 프로그램 관리 지속성"을 사용하고 있습니다.

EntityManagerFactory를 주입하는 것에 대한 논쟁은 EntityManager가 너무 무겁고 필요하지 않기 때문에 필요로하는 것을 수행합니다. 또한, Spring이 모든 웹 요청에 대해 DAO의 새로운 인스턴스를 생성하기 때문에 (나는 이것이 의심 스럽다) 동일한 EntityManager 인스턴스가 두 개의 스레드에 의해 공유되므로 동시성 문제가 발생하지 않을 것이다.

EFM을 주입하기위한 논쟁은 항상 공장에 대한 핸들을 갖기에 항상 좋은 것입니다.

나는 최선의 접근법이 확실하지 않습니다. 누군가 제게 계몽을 해주시겠습니까?

해결법

  1. ==============================

    1.EntityManagerFactory 대 EntityManager 삽입에 대한 장단점은 모두 Spring 문서에 나와 있으며,이를 향상시킬 수 있을지 확신 할 수 없습니다.

    EntityManagerFactory 대 EntityManager 삽입에 대한 장단점은 모두 Spring 문서에 나와 있으며,이를 향상시킬 수 있을지 확신 할 수 없습니다.

    그 말은, 당신의 질문에 몇 가지 포인트를 정리해야합니다.

    이것은 정확하지 않습니다. DAO가 Spring bean 인 경우, bean 정의의 scope 속성을 통해 달리 설정하지 않는 한 그것은 싱글 톤입니다. 모든 요청에 ​​대해 DAO를 인스턴스화하는 것은 미친 짓이다.

    이 논쟁은 실제로 물을 보유하지 않습니다. 일반적인 우수 사례는 개체에 작업을 수행하는 데 필요한 최소한의 공동 작업자를 투입해야한다고 말합니다.

  2. ==============================

    2.나는 내가 마침내 모은 것을 단념하고있다. Spring 레퍼런스의 "일반 JPA 기반의 DAO 구현"섹션에서 :

    나는 내가 마침내 모은 것을 단념하고있다. Spring 레퍼런스의 "일반 JPA 기반의 DAO 구현"섹션에서 :

    이는 JPA 스펙에 따라 EntityManager 인스턴스가 스레드 안전하지는 않지만 Spring이 이들을 처리하면 스레드 안전성이 있음을 의미합니다.

    Spring을 사용한다면, EntityManagerFactory 대신에 EntityManagers를 삽입하는 것이 낫다.

  3. ==============================

    3.나는 이것이 이미 잘 다루어 졌다고 생각하지만, 단지 몇 가지 포인트를 강화하기 위해서입니다.

    나는 이것이 이미 잘 다루어 졌다고 생각하지만, 단지 몇 가지 포인트를 강화하기 위해서입니다.

    즉, 내 멀티 스레드 응용 프로그램에서 싱글 톤 DAO에 대한 몇 가지 문제가있었습니다. 나는 DAO를 인스턴스화 된 bean으로 만드는 것을 끝내고 그 문제를 해결했다. 따라서 문서가 한 가지를 말할 수는 있지만 응용 프로그램을 철저히 테스트하려고합니다.

    후속 조치 :

    나는 내 문제의 일부를 내가 사용하고 있다고 생각한다.

    @PersistenceContext(unitName = "unit",
        type = PersistenceContextType.EXTENDED)
    

    PersistenceContextType.EXTENDED를 사용하는 경우, 올바르게 이해하면 트랜잭션을 수동으로 닫아야한다는 것을 명심하십시오. 자세한 내용은이 스레드를 참조하십시오.

    다른 후속 조치 :

    인스턴스화 된 DAO를 사용하는 것은 대단히 나쁜 생각입니다. DAO의 각 인스턴스는 고유 한 지속성 캐시를 가지며 하나의 캐시에 대한 변경 사항은 다른 DAO bean에 의해 인식되지 않습니다. 나쁜 조언을해서 유감입니다.

  4. ==============================

    4.DAO에서 @Repository Spring annotation을 설정하고 Spring에서 EntityManager를 관리하고 @PersistenceContext annotation을 주입하면 모든 것이 유창하게 작동하는 가장 편리한 방법이라는 것을 알게되었습니다. 공유 EntityManager의 스레드 안전성과 예외 변환의 이점이 있습니다. 기본적으로 공유 EntityManager는 관리자의 여러 DAO를 결합한 경우 트랜잭션을 관리합니다. 결국 DAO가 빈혈이 될 것입니다.

    DAO에서 @Repository Spring annotation을 설정하고 Spring에서 EntityManager를 관리하고 @PersistenceContext annotation을 주입하면 모든 것이 유창하게 작동하는 가장 편리한 방법이라는 것을 알게되었습니다. 공유 EntityManager의 스레드 안전성과 예외 변환의 이점이 있습니다. 기본적으로 공유 EntityManager는 관리자의 여러 DAO를 결합한 경우 트랜잭션을 관리합니다. 결국 DAO가 빈혈이 될 것입니다.

  5. from https://stackoverflow.com/questions/1310087/injecting-entitymanager-vs-entitymanagerfactory by cc-by-sa and MIT license