이 기사에서는 세션 및 배치 작업을 관리하기 위해 Hibernate를 사용하는 방법을 자세히 분석합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
Hibernate는 세션을 관리합니다.
Hibernate 자체는 Session 객체를 관리하는 세 가지 방법을 제공합니다. ① Session 객체의 라이프사이클은 로컬 스레드에 바인딩됩니다. ② Session 객체의 라이프사이클은 JTA 트랜잭션에 바인딩됩니다. ③ Hibernate 위임 프로그램은 Session 객체의 라이프사이클을 관리합니다.
Hibernate 구성 파일에서 hibernate.current_session_context_class 속성은 세션 관리 방법을 지정하는 데 사용됩니다. 선택 값은 다음과 같습니다.
① thread : Session 객체의 생명주기가 로컬 스레드에 바인딩됨 ② jta* : Session 객체의 생명주기가 JTA 트랜잭션에 바인딩됨 ③ Managed : Session 객체의 생명주기를 관리하는 Hibernate 위임 프로그램
Session 객체의 수명주기는 로컬 스레드에 바인딩됩니다.
Hibernate 구성 파일의 hibernate.current_session_context_class 속성 값이 thread로 설정되면 Hibernate는 로컬 스레드에 바인딩된 방식으로 Session을 관리합니다.
Hibernate는 다음 규칙에 따라 세션을 로컬 스레드에 바인딩합니다.
스레드(thread)가 처음으로 SessionFactory 객체의 getCurrentSession() 메서드를 호출하면 이 메서드는 새로운 Session(sessionA) 객체를 생성하고, 이 객체를 threadA에 바인딩하고, threadA가 다시 SessionFactory 객체를 호출하면 해당 세션을 반환합니다. getCurrentSession() 메소드를 사용할 때 이 메소드는 sessionA 객체를 반환합니다. threadA가 sessionA 객체와 연관된 트랜잭션을 제출하면 Hibernate가 자동으로 플러시됩니다. sessionA 객체를 캐시한 다음 트랜잭션을 커밋하고 원하는 대로 세션을 닫습니다. threadA가 sessionA 객체와 연관된 트랜잭션을 취소하면 sessionA 객체도 자동으로 닫힙니다. threadA가 SessionFactory 객체의 getCurrentSession() 메서드를 다시 호출하면 이 메서드는 새 Session(sessionB) 객체를 생성하고 해당 객체를 바인딩합니다. threadA. 및 세션B 반환
데이터를 일괄 처리
데이터의 일괄 처리는 하나의 트랜잭션에서 대량의 데이터를 처리하는 것을 말하며 응용 계층 프로세스의 일괄 작업은 다음과 같습니다.
① 세션을 통해
② HQL 통과
③ StatelessSession을 통해
④ JDBC API를 통해 ----가장 빠르기 때문에 추천
세션은 일괄 작업을 수행합니다.
세션의 save() 및 update() 메소드는 처리된 객체를 자체 캐시에 저장합니다. Session 개체를 사용하여 다수의 영구 개체를 처리하는 경우 처리되어 다시 액세스되지 않는 개체는 적시에 캐시에서 비워야 합니다. 구체적인 방법은 객체 또는 소규모 객체 배치를 처리한 후 즉시 플러시() 메서드를 호출하여 캐시를 새로 고친 다음, 클리어() 메서드를 호출하여 캐시를 캐시하는 것입니다.
세션을 통한 처리 작업에는 다음 제약 조건이 적용됩니다.
JDBC 단일 배치 처리 횟수는 Hibernate 구성 파일에 설정되어야 하며, 매번 데이터베이스로 전송되는 SQL 문의 배치 수가 배치 크기 속성과 일치하는지 확인해야 합니다.
객체가 "identity" 식별자 생성기를 사용하는 경우 Hibernate는 JDBC에서 일괄 삽입 작업을 수행할 수 없습니다.
배치 작업을 수행할 때 Hibernate의 2차 캐시를 끄는 것이 좋습니다
데이터 일괄 삽입을 위한 코드 데모:
코드를 복사하면 코드는 다음과 같습니다. News news = null;
for(int i = 0; i < 10000; i++) {
뉴스 = 새로운 뉴스();
news.setTitle("--" + i);
session.save(뉴스);
if((i + 1) % 20 == 0) {
세션.플러시();
session.clear();
}
}
일괄 업데이트: 일괄 업데이트를 수행할 때 모든 개체를 한 번에 세션 캐시에 로드한 다음 캐시에서 하나씩 업데이트하는 것은 분명히 권장되지 않습니다.
스크롤 가능한 결과 세트 org.hibernate.ScrollableResults를 사용하십시오. 이 객체는 실제로 어떤 객체도 포함하지 않으며 온라인에서 레코드를 찾는 데 사용되는 커서만 포함합니다. 프로그램이 ScrollableResults 개체의 특정 요소에 액세스하기 위해 탐색할 때만 데이터베이스에 해당 개체를 로드합니다.
org.hibernate.ScrollableResults 객체는 Query의 스크롤 메소드에 의해 반환됩니다.
HQL을 통한 일괄 작업:
참고: HQL은 INSERT INTO...SELECT 형식의 삽입 문만 지원하고 INSERT INTO...VALUES 형식의 삽입 문은 지원하지 않습니다. 따라서 HQL을 사용하여 일괄 삽입 작업을 수행할 수 없습니다.
StatelessSession을 통한 일괄 작업:
공식적으로 StatelessSession의 사용법은 Session과 유사합니다. Session과 비교하여 StatelessSession은 다음과 같은 차이점이 있습니다.
StatelessSession에는 캐시가 없으며 StatelessSession을 통해 로드, 저장 또는 업데이트된 개체는 무료 상태입니다.
StatelessSession은 Hibernate의 두 번째 수준 캐시와 상호 작용하지 않습니다. StatelessSession의 save(), update() 또는 delete() 메서드를 호출할 때 이러한 메서드는 하나의 SQL 문만 실행하도록 계획하는 대신 해당 SQL 문을 즉시 실행합니다.
StatelessSession은 더티 검사를 수행하지 않으므로 Customer 개체 속성을 수정한 후 StatelessSession의 update() 메서드를 호출하여 데이터베이스의 데이터를 업데이트해야 합니다.
StatelessSession은 연결된 개체에 대해 계단식 작업을 수행하지 않습니다. OID가 1인 Customer 개체는 동일한 StatelessSession 개체를 통해 두 번 로드됩니다. 얻은 두 개체의 메모리 주소는 다릅니다.
StatelessSession에 의해 수행되는 작업은 Interceptor 인터셉터에 의해 캡처될 수 있지만 Hibernate의 이벤트 처리 시스템에서는 무시됩니다.
이 글이 모든 사람의 Java 프로그래밍에 도움이 되기를 바랍니다.