2014-11-17 5 views
1

나는 종종이 용어들을 접하게되었습니다. 그들의 차이는 그들 중 2 명입니까? 자바 코드의 다음 부분에서 JPA, JTA의 논리 작업 단위 (Logite Unit) 및 단일 작업 단위 (UU)

는 방법은 스레드 안전 :

다음 최대 절전 모드에서의 SessionFactory에 대한 컨텍스트 및 세션에서
class Counter { 
    private int i = 0; 

    public synchronized void inc() { 
     i++; 
    } 
} 

,

SessionFactory (org.hibernate.SessionFactory) - A thread-safe 

Session (org.hibernate.Session) - A single-threaded, short-lived object representing a 
conversation between the application and the persistent store. 

내가 이해 여기에 혼란스러워 자신의 정의.

내가 흡수하는 모든

은 그 SessionFactory를이기 때문이다 스레드 안전는, 어떤 스레드가 먼저 잠금을 획득해야 다음 구현의 자유를 보장 즉, 그 작업을 할 것입니다 동시에 여러 스레드가 액세스 할 때 경쟁 조건이 발생합니다.. (나는 을 동시에 작성했으며이 아니고 이 아닙니다.입니다. 하나의 스레드가 작업을 마친 후에 대기열에있는 다른 스레드가 잠금을 획득하는 식으로 진행됩니다. 2 번 스레드가 정확히 동시에 작동하지 않습니다.

세션 스레드로부터 안전하지이며, 작업의 단일 스레드 단위를 나타냅니다.

sessionfactory 후에 여러 세션 (세션 팩토리에서)이 각각 고유 한 단일 스레드에서 자체 작업에 걸쳐 전개됩니까?

답변

1

SessionFactory는 스레드로부터 안전하며 주어진 DataSource에 대한 Singleton Sessionfactory를가집니다.

세션 수는 either be created for the life time of a single request or even extended to span over multiple user requests입니다.

세션은 항상 주어진 시간에 단일 스레드에 바인딩되어야합니다. 확장 된 영속 컨텍스트를 사용하는 경우에도 특정 시점에 세션에 액세스하는 요청/스레드는 하나뿐입니다.

따라서 세션에 동시에 액세스하면 안됩니다. 그래서 적어도 Hibernate 관점에서가 아니라 엔티티를 동기화 할 필요가 없습니다. 각 세션은 자신의 엔티티 복사본을로드하고 application-level repeatable reads을 갖는 것이 바람직하기 때문에 동시성은 일반적으로 optimistic locking으로 보장됩니다.

엔티티를 동기화하면 안됩니다. 동시성 제어는 응용 프로그램 논리가 아닌 데이터베이스 내부에서 발생합니다. 각 클라이언트 요청은 항상 실제 데이터베이스 트랜잭션의 범위에서 DML 문을 발행하고 database transactions always acquire locks when rows get changes (even for READ_COMMITTED)입니다.

모두 세션은 첨부 된 모든 엔터티와 함께 ​​트레드 안전하지 않습니다. Session Factory는 DataSource 당 하나의 싱글 톤 인스턴스 만 가져오고 새로운 세션을 생성하기 위해이를 사용하기 때문에 스레드로부터 안전합니다.