나는 데이터베이스를 사용하여 데이터를 유지하기 위해 jpa를 사용하는 자바 SE 프로젝트에서 작업 중이다.jpa : 자바 SE 개발에서 jpa를 사용하는 방법
지금 당장 나는 각 데이터베이스 작업에 대해 새로운 엔티티 관리자를 얻고 함수 호출이 끝나면 닫습니다. like
그러나 관리자에게는 다 - 대다 관계가 매우 어렵습니다. 예 :
B 엔티티와 다 대다 관계를 가진 엔티티가 있습니다. 이고 CascadeType.MERGE가 있습니다.
일단 내가 A를 만들면 B를 만들고 여러 스레드를 실행하여 A와 B 모두에 대한 정보를 생성합니다. 그러나 B는 A의 오래된 데이터를 유지합니다. B를 병합하면 A의 데이터가 제거됩니다.
예를 들면. A는 음악이고, B는 음악 앨범이므로 하나의 B에는 A 목록이 있습니다. 다른 스레드는 음악 메타 데이터를 읽고 음악 태그 정보를 얻고 업데이트 A, B가 FS에 새로운 A가 발견되면 업데이트됩니다.
엔티티 관리자가 종료되었으므로 B의 A 목록에있는 엔티티가 오래된 것입니다. 즉, A 자체를 업데이트 할 때 B가 업데이트 된 것을 알지 못합니다. B를 병합하면 jpa가 B의 A 목록에있는 엔티티를 사용하여 A를 병합하는 데 도움이됩니다.
이 문제를 해결하려면 하나의 엔티티 관리자를 사용하고 모든 데이터베이스 작업을 하나의 단일 스레드에 넣기로 결정합니다. 그러면 새로운 문제가 나온다.
트랜잭션이 활성화되고 트랜잭션이
transaction.begin();
....
transaction.end();
그러나 실행 많은 스레드가 사이의 개체에 대한 열 예정이다, 그 스레드가 너무 개체를 변경할 수 있습니다.
내 질문 : 자바 SE 개발에 jpa를 사용하는 방법? 감사합니다
이것이 특정 JPA 문제가 아니라고 말하고 싶습니다. 단지 멀티 스레딩 문제입니다. 당신이 필요로하는 곳에서 올바르게 동기화해야합니다 ... – home
이 문제를 해결할 수 없습니다 ... 트랜잭션이 켜지면 다른 스레드를 차단할 수 없습니다 ... – Xiwen
하지만 특정 정보를 동기화하려면해야합니다. 응용 프로그램을 완전히 이해하지 못했지만 하나의 EntityManager 인스턴스로 작업해야 할 수도 있습니다. java.util.concurrent.ReentrantReadWriteLock' 귀하의 데이터 액세스 레이어를 제어 할 수 있습니다 ... – home