programing

엔티티 관리자를 주입하는 중입니다.엔티티 매니저 팩토리

topblog 2023. 9. 15. 20:40
반응형

엔티티 관리자를 주입하는 중입니다.엔티티 매니저 팩토리

긴 질문입니다. 참아주세요.

제이스프링+J를 사용하고 있습니다.웹 응용 프로그램에 대한 PA.우리 팀은 지금 주사에 대해 논의 중입니다.EntityManagerFactoryGenericDAO으로 하는 , 는 사용하지 (APPFUSE에서 Generics something을 DAO,지음한 )JpaDaosupport인지) γ γ δ를 하게 주입합니다.EntityManager는 " 관리지속성하고 있습니다. 우리는 "애플리케이션 관리 지속성"을 사용하고 있습니다.

하는 에 하는 를 하는 하는 에 를 EntityManagerFactory 것, 즉 Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ,EntityManager우리가 필요한 일을 합니다.요청에 은 Spring웹에든운 DAO만에기성할한다는지을를한해의so다n을ge,rysteoesfdyiesageb(etwy)는t한한oagae(에EntityManager인스턴스는 두 개의 스레드에 의해 공유됩니다.

EFM을 주입하는 것에 대한 주장은 공장에 대한 핸들을 가지는 것이 모든 것에 있어서 좋은 관행이라는 것입니다.

어떤 방법이 최선인지 잘 모르겠는데, 누가 좀 알려주실 수 있나요?

EntityManagerFactory와 EntityManager를 주입하는 것에 대한 장단점은 모두 여기 Spring 문서에 설명되어 있습니다. 개선할 수 있을지 모르겠습니다.

그렇기 때문에, 당신의 질문에 해명해야 할 점들이 있습니다.

...Spring은 모든 웹 요청에 대해 DAO의 새로운 인스턴스를 생성할 것입니다.

이것은 올바르지 않습니다. DAO가 Spring bean을 입니다.단,른지는한로다면한는지단f,로u른다tscope빈 정의에서 속성을 지정합니다.모든 요청에 대해 DAO를 인스턴스화하는 것은 미친 짓입니다.

EMF를 주입해야 한다는 주장은 공장에 대한 핸들을 갖는 것이 항상 좋은 방법이라는 것입니다.

이 주장은 별로 타당하지 않습니다.일반적인 모범 사례에 따르면 어떤 대상은 자신의 일을 수행하는 데 필요한 최소한의 협력자와 함께 주입되어야 합니다.

저는 제가 드디어 모은 것을 내려놓고 있습니다.스프링 참조의 "일반 JPA를 기반으로 DAO 구현" 섹션에서 다음과 같이 설명합니다.

EntityManagerFactory 인스턴스는 스레드 세이프이지만 EntityManager 인스턴스는 그렇지 않습니다.주입된 JPA EntityManager는 JPA 규격에 정의된 대로 응용 프로그램 서버의 JNDI 환경에서 가져온 EntityManager와 같이 동작합니다.모든 호출을 현재 트랜잭션 Entity Manager(있는 경우)에 위임합니다. 그렇지 않으면 작업별로 새로 생성된 Entity Manager(EntityManager)로 다시 돌아가 사실상 쓰레드 안전하게 사용할 수 있습니다.

즉, JPA 사양에 따라 EntityManager 인스턴스는 스레드 안전하지 않지만 Spring에서 이를 처리하면 스레드 안전한 상태가 됩니다.

Spring을 사용하는 경우 EntityManagerFactory 대신 EntityManager를 주입하는 것이 좋습니다.

이것은 이미 잘 다루었다고 생각하지만, 단지 몇 가지 사항을 보강하기 위해서입니다.

  • DAO는 Spring이 주입하는 경우 기본적으로 싱글톤입니다.매번 새 인스턴스를 생성하려면 범위를 프로토타입으로 명시적으로 설정해야 합니다.

  • @PersistenceContext에서 주입한 엔티티 관리자는 스레드 안전합니다.

그렇기는 하지만, 제 멀티 스레드 애플리케이션에서 싱글톤 DAO에 문제가 좀 있었습니다. 저는 DAO를 인스턴트 원두로 만들었고 그것이 문제를 해결했습니다. 따라서 설명서에서 한 가지를 말할 수 있지만 응용프로그램을 철저히 테스트하고 싶을 수도 있습니다.

후속 조치:

제 문제의 일부는 제가 사용하고 있다는 것입니다.

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

PersistenceContextType을 사용하는 경우.EXTED, 제가 제대로 이해했다면 수동으로 거래를 종료해야 한다는 것을 명심하세요.자세한 내용은 이 스레드를 참조하십시오.

다른 후속 조치:

인스턴스화된 DAO를 사용하는 것은 매우 나쁜 생각입니다.DAO의 각 인스턴스에는 고유한 지속성 캐시가 있으며 하나의 캐시에 대한 변경 사항은 다른 DAO 빈에서 인식되지 않습니다.나쁜 충고를 해서 죄송합니다.

DAO에 @Repository Spring 주석을 설정하고 EntityManager를 Spring에서 관리하고 @PersistenceContext 주석에서 주입하는 것이 모든 작업을 원활하게 수행하는 가장 편리한 방법임을 알게 되었습니다.공유 Entity Manager의 스레드 안전성과 예외 변환의 이점을 얻을 수 있습니다.예를 들어 관리자의 DAO를 여러 개 결합하면 기본적으로 공유 Entity Manager가 트랜잭션을 관리합니다.결국 당신은 당신의 DAO가 빈혈이 된다는 것을 알게 될 것입니다.

언급URL : https://stackoverflow.com/questions/1310087/injecting-entitymanager-vs-entitymanagerfactory

반응형