이 기사에서는 최대 절전 모드 배치 작업 방법에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
최대 절전 모드 배치 처리
최대 절전 모드는 데이터베이스를 객체 지향 방식으로 완전히 작동합니다. 영구 객체가 프로그램에서 객체 지향 방식으로 작동하면 데이터베이스의 작업으로 자동 변환됩니다. 예를 들어, 영구 객체를 삭제하기 위해 Session의 Delete () 메소드를 호출 할 때 Hibernate는 해당 데이터 레코드를 삭제할 책임이 있습니다. 영구 객체의 설정 방법을 실행할 때 최대 절전 모드는 해당 업데이트 메소드로 자동 변환하고 데이터베이스의 해당 레코드를 수정합니다.
문제는 100,000 개의 레코드를 동시에 업데이트 해야하는 경우 10 만 레코드를 하나씩로드 한 다음 세트 메소드를 차례로 호출 해야하는지입니다. 이 배치 처리 시나리오의 경우 최대 절전 모드는 배치 처리 솔루션을 제공합니다. 다음은 배치 삽입, 배치 업데이트 및 배치 삭제의 세 가지 측면 에서이 배치 처리 상황에 직면하는 방법을 소개합니다.
1 배치 삽입물
데이터베이스에 100,000 개의 레코드를 삽입 해야하는 경우 최대 절전 모드는 일반적으로 다음을 사용할 수 있습니다.
세션 세션 = sessionFactory.Opensession (); 트랜잭션 TX = 세션. session.save (customer);} tx.commit (); session.close ();
그러나이 프로그램이 진행됨에 따라 항상 어느 시점에서 실패하고 외부인이 발생합니다. Hibernate의 세션은 필요한 레벨 1 캐시를 보유하고 있으며 모든 사용자 인스턴스는 세션 수준 캐시 영역에 캐시되기 때문입니다.
이 문제를 해결하려면 매우 간단한 아이디어가 있습니다. 세션에 의해 캐시 된 데이터를 항상 세션 수준에서 캐시하는 대신 데이터베이스로 정기적으로 새로 고치십시오. 저장된 각 사용자 인스턴스에 대해 1 씩 증가하는 축합기 설계를 고려할 수 있습니다. 세션 캐시의 데이터를 축합기 값에 따라 데이터베이스로 플러시 해야하는지 확인하십시오.
다음은 100,000 개의 사용자 인스턴스를 추가하는 코드 스 니펫입니다.
private void testuser ()는 예외를 던져 {// 열린 세션 세션 세션 = hibernateutil.currentsession (); // 트랜잭션 트랜잭션 시작 tx = session.beginTransaction (); // 100,000 회 루프를하고 (int i = 0; i <10000000; i ++)에 대한 100,000 레코드를 삽입합니다. {// 사용자 인스턴스 생성 USER U1 = new User (); u1.setname ( "xxxxx" + i); U1. 세트 (i); U1.Setnationality ( "중국"); // 사용자 인스턴스 세션을 캐시합니다 .Save (u1); // 축적기가 20의 배수 일 때마다 세션의 데이터를 데이터베이스로 플러시하고 (i % 20 == 0) {session.flush (); session.clear (); tx.commit (); tx = session.begintransaction (); }} // commit transaction tx.commit (); // 트랜잭션 hibernateutil.closesession ();}위 코드에서 I%20 == 0 인 경우 세션의 캐시 된 데이터는 데이터베이스에 수동으로 작성되며 트랜잭션은 수동으로 제출됩니다. 트랜잭션이 제출되지 않으면 데이터는 여전히 트랜잭션 사무소에 캐시됩니다. 데이터베이스에 입력하지 않았으므로 메모리 오버플로를 제외하고도 있습니다.
이것은 세션 수준 캐시의 처리이며 SessionFactory의 보조 캐시도 다음 구성을 통해 꺼야합니다.
hibernate.cache.use_second_level_cache false
참고 : 세션 수준 캐시를 수동으로 지우는 것 외에도 SessionFactory 레벨 2 차 캐시를 끄는 것이 가장 좋습니다. 그렇지 않으면, 세션 수준 캐시가 수동으로 지우더라도 세션 변환 레벨에 여전히 캐시가 있기 때문에 예외가 발생할 수 있습니다.
2 배치 업데이트
위에서 설명한 방법은 배치 업데이트 데이터에도 적합합니다. 여러 행의 데이터를 반환 해야하는 경우 Scroll () 메소드를 사용하여 서버 측 커서가 가져 오는 성능 장점을 최대한 활용할 수 있습니다. 다음은 배치 업데이트를위한 코드 스 니펫입니다.
private void testuser ()는 예외를 던져 {// 열린 세션 세션 세션 = hibernateutil.currentsession (); // 트랜잭션 트랜잭션 시작 tx = session.begintransaction (); // 사용자 테이블의 모든 레코드 쿼리 scrollBeresults users user = session.createquery ( "from user") .setCacheMode (cachemode.ignore) .scroll (scrollmode.forward_only); int count = 0; // 사용자 테이블의 모든 레코드를 트랜잭션 while (user.next ()) {user u = (user) users.get (0); U.setName ( "새 사용자 이름" + count); // COUNT가 20의 배수 인 경우 세션에서 업데이트 된 결과를 데이터베이스로 플러시합니다. session.clear (); }} tx.commit (); hibernateutil.closesession ();} 이러한 방식으로 배치 업데이트를 수행 할 수는 있지만 효과는 매우 열악합니다. 실행 효율이 높지 않으며 데이터 쿼리가 먼저 필요하며 데이터 업데이트가 수행됩니다. 이 업데이트는 행으로 업데이트됩니다. 즉, 레코드 행이 업데이트 될 때마다 업데이트 문을 실행해야하며 성능이 매우 낮습니다.
이를 피하기 위해 Hibernate는 배치 업데이트 및 배치 삭제를 위해 SQL과 유사한 HQL 구문을 제공합니다.
3 SQL 스타일의 배치 업데이트/삭제
Hibernate가 제공 한 HQL 문은 배치 업데이트 및 삭제 구문도 지원합니다.
배치 업데이트 및 삭제 문의 구문 형식은 다음과 같습니다.
업데이트 | 삭제? ClassName [where_conditions]
위의 구문 형식에 대해 주목할 가치가있는 4 가지 점이 있습니다.
● From Clause에서 From Keyword는 선택 사항입니다. 즉, 키워드에서 전혀 쓸 수 없습니다.
● From Clause에는 클래스 이름이 하나만있을 수 있으며 클래스 이름에는 별칭이 없습니다.
● Batch HQL 문에서 연결을 사용할 수 없으며 명시 적이거나 암시적이지 않습니다. 그러나 하위 쿼리는 WHERE 절에서 사용할 수 있습니다.
● 전체 위치는 선택 사항입니다.
사용자 클래스 인스턴스의 이름 속성을 배치해야한다고 가정하면 다음 코드 스 니펫을 사용할 수 있습니다.
private void testuser ()는 예외를 던져 {// 열린 세션 세션 세션 = hibernateutil.currentsession (); // 트랜잭션 트랜잭션 시작 tx = session.beginTransaction (); // 배치 업데이트 정의 HQL 문자열 hqlupdate = "Usude User Set Name = : newName"; // 업데이트 int ordudentities = session.createquery (hqlupdate) .SetString ( "newName", "new Name") .ExecuteUpDate (); // 트랜잭션 커밋 tx.commit (); hibernateutil.closesession ();}위의 코드에서 볼 수 있듯이이 구문은 준비 상태의 ExecuteUpdate 구문과 매우 유사합니다. 실제로, HQL 의이 배치 업데이트는 SQL 구문의 업데이트 명령문에서 직접 차용하고 있습니다.
참고 :이 배치 업데이트 구문을 사용하는 경우 일반적으로 조건부 레코드를 충족하는 모든 업데이트를 완료하기 위해 SQL 업데이트 문을 한 번만 실행하면됩니다. 그러나 고객 인스턴스가있는 사람 인스턴스와 같은 상속 매핑과 같은 특별한 경우가 있기 때문에 여러 업데이트 문을 실행해야 할 수도 있습니다. Batch가 Person Instances를 업데이트하면 고객 인스턴스도 업데이트해야합니다. 가입 서브 클래스 또는 Union-Subclass 매핑 전략을 사용하는 경우 개인 및 고객 인스턴스가 다른 테이블에 저장되므로 여러 업데이트 문이 필요할 수 있습니다.
HQL 삭제를 실행하고 query.executeupdate () 메소드를 사용하십시오. 다음은 위의 모든 레코드를 한 번에 삭제하는 코드 스 니펫입니다.
private void testuser ()는 예외를 던져 {// 열린 세션 인스턴스 세션 세션 = hibernateutil.currentsession (); // 트랜잭션 트랜잭션 시작 tx = session.beginTransaction (); // 배치 삭제를 정의합니다. 문자열 HQLUPDATE = "삭제"; // 배치 삭제 int int updatedentities = session.createquery (hqlupdate) .ExecuteUpdate (); // 트랜잭션 커밋 tx.commit (); // 세션 hibernateutil.closesession ();} 닫기query.executeupdate () 메소드에 의해 정수 값을 반환합니다.이 작업의 영향을받는 레코드 수입니다. 실제로 Hibernate의 기본 작업은 JDBC를 통해 수행됩니다. 따라서 여러 업데이트 또는 삭제 명령문으로 변환되는 업데이트 또는 삭제 작업이있는 경우이 메소드는 마지막 SQL 문의 영향을받는 레코드 수를 리턴합니다.
이 기사의 설명이 최대 절전 모드 프레임 워크를 기반으로 한 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.