웹 응용 프로그램에서 사용할 때 문제를 일으킬 Java DAO의 메서드에 'synchronized'키워드를 사용하고 있습니까?Java DAO에서 동기화를 사용하여 문제가 발생합니까?
여기에 표시된 것처럼 리소스 충돌을 피하기 위해 동기화 된 메서드가 필요한 멀티 스레드 독립 실행 형 응용 프로그램이 있기 때문에 물어 봅니다. 나는이 걱정 무엇
java.util.concurrent.ExecutionException: javax.persistence.PersistenceException: org.hibernate.HibernateException: Found shared references to a collection: com.replaced.orm.jpa.Entity.stuffCollection
은 그 사람의 상당수가 시도하고 동기화 방법을 차단하고 전체 응용 프로그램을 느리게 할 응용 프로그램을 사용할 때.
저는 Spring에서 삽입 된 JPA 엔티티 관리자 팩토리를 사용하고 있습니다.이 팩토리 팩토리는 DAO에 엔티티 관리자를 제공합니다. 기술적으로 DAO 레이어를 제거하고 클래스가 엔티티 관리자 팩토리를 직접 호출하도록 할 수는 있지만 DAO가 제공하는 분리를 즐깁니다.
스레드간에 연결된 엔터티 ORM 개체를 전달하지 않도록 매우 조심하고 있습니다. 필자는 DAO에 액세스 할 때 리소스 충돌 오류가 발생한다고 추측합니다. 여러 스레드가 동시에 가고 비 지속성 방식으로 데이터베이스에서 지속하거나 읽으려고합니다.
이 경우 DAO를 사용하면 더 많은 피해를 입히고 도움이됩니까?
큰 문제는 DAO가 싱글 톤이 아니라는 것입니다. 내가 그 세부 사항을 포함 할만큼 충분히 명쾌하게 생각해왔다면 아마도 처음에는 그 질문을하지 않았을 것입니다.
올바르게 이해하면 Spring은 그것을 사용하는 각 클래스에 대해 DAO 클래스의 새 인스턴스를 만듭니다. 따라서 backing entity manager는 각 스레드마다 고유해야합니다. 엔티티 관리자를 공유하지 않는 것은 Rob H가 대답 한 것처럼 핵심적인 부분입니다.
그러나 이제 동기화를 제거 할 때 오류가 발생하는 이유를 알 수 없습니다.
이 thread에 따르면, @PersistenceContext 주석은 스레드 안전 SharedEntityManager을 만듭니다. 따라서 싱글 톤 DAO를 생성 할 수 있어야합니다.
동기를 사용하는 이유와 관련하여 어떤 종류의 "리소스 충돌"을 확장 할 수 있습니까? – skaffman