이 기사에서는 최대 절전 모드 지연 하중의 원리 및 구현 방법을 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
최대 절전 모드 성능을 더욱 최적화하려면 다음을 사용할 수 있습니다.
대기 시간 로딩 기술, 데이터 크롤링 전략 관리 및 캐시 관리 수행을 수행하여 최대 절전 모드 성능을 향상시킵니다.
1. 지연 하중 (로드)
게으른 하중은 최대 절전 모드가 프로그램 실행 효율을 향상시키기 위해 제공되는 메커니즘입니다. 즉, 객체의 데이터가 실제로 사용될 때만 생성됩니다.
게으른 하중 과정 : 지연 하중은 프록시 메커니즘을 통해 달성됩니다. Hibernate는 데이터베이스에서 특정 객체에서 데이터를 얻거나 객체의 수집 속성 값을 얻거나 개체와 관련된 다른 객체를 얻을 때 객체의 데이터가 사용되지 않기 때문에 (식별자 제외), Hibernate는 데이터베이스에서 실제 데이터를로드하지 않고 객체를 나타내는 대상 객체를 생성합니다. 이 객체의 모든 속성은 기본값입니다. 이 실제 객체는 객체의 데이터를 실제로 사용해야하며 데이터가 실제로 데이터베이스에서로드 된 경우에만 생성됩니다.
세션에서로드 () 메소드가 호출되면 엔티티를로드 할 때; 세션이 엔티티를로드하면 엔티티의 컬렉션 속성 값은 지연된로드로로드됩니다. 세션이 엔티티를로드하면 엔티티가 단일 엔드 인 다른 엔터티 객체, 지연된 하중은 단일 끝과 관련된 다른 엔티티 객체에 사용됩니다.
게으른 하중을 끄기 : 단일 엔티티를로드 할 때는 get () 메소드를 사용할 수 있습니다.
엔티티의 수집 속성의 경우이 세트 (<set>, <bag>, <ist>…)에 속성 Lazy = "False"를 추가 할 수 있습니다. 다른 엔티티 객체의 단일 엔드 연관이 <일대일>, <verlo-one>을 구성하여 맵핑 파일에 Lazy = "false"를 추가하기 위해 구성 할 수 있습니다. 참고 : 일대일이 제약을받을 수 없습니다 = true (생성 된 SQL 문에 외래 키가 표시됩니다). 그렇지 않으면 게으른로드가 작동하지 않습니다.
2. 게으른 하중의 주요 유형은 기본적으로 최대 절전 모드에 사용됩니다.
• 세션의로드 () 메소드가 엔티티를로드하도록 호출 될 때 게으른 하중이 사용됩니다.
• 세션이 엔티티를로드하면이 엔티티의 수집 속성 값에 지연이로드됩니다. (일대일)
• 세션이 엔티티를로드 할 때 엔티티와 관련된 단일 엔드 (일대일,다면) 인 다른 엔티티 객체는 게으른로드됩니다.
• 두 번째와 세 번째의 차이점은 다음과 같습니다. 두 번째 경우, 지연로드를 취소하는 방법은 세트 속성을 갖는 한 당사자의 매핑 파일의 설정 태그 후에 게으른로드 속성 Lazy = "False"를 설정하는 것입니다. 세 번째 경우, 다중 당사자의 매핑 파일에있는 다중 하나의 태그는 다중-하나, 즉 다중 태그가 설정됩니다.
게으른로드 할 수있는 객체는 모두 다시 작성된 프록시 객체입니다. 관련 세션이 닫히지 않은 경우, 이러한 게으른로드 된 객체 (프록시)의 속성에 액세스하면 (getID 및 getClass 제외) 최대 절전 모드 가이 프록시를 초기화하거나 Hibernate.initialize (프록시)를 사용하여 프록시 개체를 초기화합니다. 관련 세션이 닫히면 게으른로드 된 물체에 액세스하는 예외가 발생합니다.
3. 크롤링 전략 (Fetch)
"크롤링 정책"을 구성하여 세션의 get () 및 load () 메소드의 쿼리 효과에 직접 영향을 미칩니다.
단일 끝 협회의 크롤링 전략 <lever-one> <one-to_one> :
단일 끝 관련 매핑 요소에 페치 속성을 추가 할 수 있습니다. 선택 : 지연 하중; 조인 : 동일한 선택 문에서 연결 내 연결을 사용하여 객체의 데이터와 관련 객체의 데이터를 얻습니다. 현재 관련 객체의 지연 로딩이 유효합니다.
수집 속성에 대한 크롤링 전략 :
선택 : 지연 하중; 가입 : 동일한 선택 문서에서 합의 내를 사용하여 상대방의 협회 세트를 얻습니다. 현재 관련 세트의 게으른 것이 유효하지 않습니다. 하위 선택 : 다른 쿼리 명령문 또는 하위 쿼리를 보내어 크롤링하십시오. 이 전략은 HQL 쿼리에도 적용됩니다.
4. 게으른 부하 케이스 분석
사례 1 : 단일 엔티티가 LOAD () 메소드를 호출하여 게으른 하중을 취소합니다.
package com.hbsi.test; import org.hibernate.session; import org.junit.test; import com.hbsi.domain.user; import com.hbsi.utils.hibernateutil; publicclass testlazy {// test () method; get () 메소드 @testpublic testget () {testpublic testget () {testpublic void testget () hibernateutil.getSession (); user user = (user) session.get (user.class, 1); // system.out.println (user.getName ()); HiberNateUtil.close (); 비록 관리 상태이지만이 객체는 속성 값이있는 객체이며 삭제하지는 않지만 데이터베이스를 처리하기 위해 채널 만 분리합니다. System.out.println (user.getName ());} // testload () 메소드; SQL 문을 실행하지 말고 @TestPublicVoid TestLoad () {세션 세션 = hibernateUtil.getSession (); user user = (user) session.load (user.class, 1); // 여기에 출력 ID가 실행되지 않습니다. 위에서 전달한 ID에서 ID를 직접 얻습니다. 데이터베이스에서 검색되지 않으므로 SQL 문 System.out.println (user.getid ()); // 출력 이름이 다릅니다. 현재 프록시 객체는 실제로 인스턴스화됩니다. 이름 속성이있는 프록시 객체입니다. 현재 세션을 닫 더라도이 개체를 통해 여전히 이름을 얻을 수 있습니다. 이 문장, 즉 프록시 객체가 프록시 객체를 인스턴스화하지 않은 다음 세션을 닫은 후 출력 이름 속성을 실행하면 오류 가보고됩니다.상황 2 : 세트에서 게으른로드를 취소합니다
수집 속성의 게으른 부하가 매핑 파일에서 False로 설정되어 있는지 테스트하면 주문 테이블의 데이터와 함께 두 개의 선택 문장이 있습니다.
@TestPublicVoid insing () {세션 세션 = hibernateutil.getSession (); customer cus = (customer) session.get (customer.class, 3); system.out.println (cus.getcname ()); // 이틀 동안 SQL 진술을 출력하여 분리됩니다. 게으른로드가 사용되면 두 개의 SQL 문이 먼저 출력되며 출력 결과는 // 메소드를 여기에 직접 연결하여 cus.getord (). getoname (); cus.getord ()가 세트 세트 세트를 반환하기 때문에 <orders> orders = cus.getord (); system.err.println (orders.size ()); hibernateutil.close ();}방법 3 : <일대일>, <다-하나> 게으른 하중 취소
@TestPublicVoid find () {// 기본적으로 게으른로드, 즉 SQL 문으로 출력합니다. 지연 로딩이 False로 설정되고 두 개의 SQL 문을 출력하면 원치 않는 고객 정보가 있습니다. 세션 세션 = hibernateutil.getSession (); Orders Orders ord = (Orders) Session.get (Orders.Class, 3); System.out.println (ord.getoname ()); HibernateUtil.close ();}이 기사의 설명이 최대 절전 모드 프레임 워크를 기반으로 한 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.