휴지 상태에서의 지연 로딩이란 무엇입니까?
Java 로딩이란 무엇입니까?나는 그 과정을 이해할 수 없다.누가 내가 게으른 짐을 싣는 과정을 이해할 수 있도록 도와줄 수 있나요?
당신이 부모가 있고 그 부모에게 아이들이 있다고 가정해보세요.휴지 상태에서는, 아이를 「lazy-load」할 수 있습니다.즉, 부모 로드시에 실제로 모든 아이를 로드하는 것은 아닙니다.대신 요청 시 로드됩니다.이것은 명시적으로 요구할 수 있습니다.또, 보다 일반적인 요구입니다만, 아이에 액세스 하려고 하면, 휴지 상태가 자동적으로 로드됩니다.
대부분의 경우 자녀가 필요하지 않기 때문에 로드하지 않기 때문에 느린 로딩은 성능을 크게 향상시키는 데 도움이 됩니다.
또한 n+1 문제에 주의하십시오.hibernate는 컬렉션에 액세스할 때 실제로 모든 어린이를 로드하지 않습니다.대신 각 아이를 개별적으로 로드합니다.컬렉션에 대해 반복할 경우 모든 하위 항목에 대한 쿼리가 발생합니다.이를 피하기 위해 예를 들어 parent.getChildren().size()를 호출하여 모든 아이를 동시에 로드하도록 최대 절전 모드를 설정할 수 있습니다.
"Lazy loading"은 실제로 처음 엔티티에 액세스할 때만 엔티티가 로드됨을 의미합니다.
패턴은 다음과 같습니다.
public Entity getEntity() {
if (entity == null) {
entity = loadEntity();
}
return entity;
}
따라서 대규모 데이터셋의 모든 엔티티를 사전에 로드/프리필하는 비용이 절감되지만 실제로는 모든 엔티티가 필요하지 않습니다.
휴지 상태에서 하위 엔티티 컬렉션을 느리게 로드하도록 구성할 수 있습니다.그 후, 실제의 게으른 로드는, 휴지 상태가 「후드아래」를 사용해 엔티티의 컬렉션을 할당하는 메서드내에서 행해집니다.Set
.
예.
public class Parent {
private Set<Child> children;
public Set<Child> getChildren() {
return children;
}
}
.
public void doSomething() {
Set<Child> children = parent.getChildren(); // Still contains nothing.
// Whenever you call one of the following (indirectly),
// Hibernate will start to actually load and fill the set.
children.size();
children.iterator();
}
Martin Fowler는 엔터프라이즈 애플리케이션 아키텍처의 패턴에서 다음과 같이 Lazy Load 패턴을 정의합니다.
필요한 데이터를 모두 포함하는 것은 아니지만 가져오는 방법을 알고 있는 객체.
따라서 특정 개체를 로드할 때 관련 성능 비용을 절약하기 위해 즉시 사용하지 않을 수 있는 관련 개체를 빠르게 로드하지 않는 것이 좋습니다.대신 관련 개체는 사용 중인 경우에만 로드됩니다.
이것은 데이터 액세스와 휴지기에 고유한 패턴은 아니지만 이러한 필드에서 특히 유용합니다. 휴지기는 특정 조건에서도 1대 다의 어소시에이션과 싱글 포인트 어소시에이션(1대 1 및 다대 1)의 느린 로드를 지원합니다.느린 상호 작용에 대해서는 휴지 상태 3.0 참조 문서의 19장에서 자세히 설명합니다.
디폴트로는 lazy loading은 true입니다.느린 로딩은 선택 쿼리가 실행될 때 데이터베이스에 영향을 미치지 않음을 의미합니다.getter 함수를 대기합니다.즉, 필요할 때 데이터베이스로부터 가져옵니다.예를 들어 다음과 같습니다.당신은 장난감을 많이 가진 아이가 있는 부모입니다.하지만 요즘 문제는 (남자아이가 있다고 가정할 때) 전화할 때마다 그 아이가 장난감을 모두 가지고 독자 분께 온다는 거예요.당신은 그가 항상 장난감을 가지고 다니지 않기를 바라기 때문에 이것이 문제입니다.따라서, 이론적 부모로서 아이의 장난감을 LAGY라고 정의합니다.이제 네가 그에게 전화할 때마다, 그는 장난감 없이 너에게 온다.
문외한의 언어로 말하자면, 케이크를 만드는 것과 같으며 냉장고에서 5~10개의 재료가 필요할 것이다.냉장고에서 모든 재료를 꺼내 주방용 플랫폼에 올려놓거나, 필요할 때 원하는 물건을 가져오거나, 두 가지 선택지가 있습니다.
마찬가지로, 빠른 로딩에서는 콩과 그 관련 클래스에 대한 모든 정보를 가져옵니다(자녀나 친척이 아니라 관계가 있습니다.즉, 케이크가 밀가루, 우유, 크림 등). 그리고 로딩이 느릴 경우, 먼저 같은 테이블에서 나오는 식별자와 값만 가져옵니다(먼저 필요한 재료).케이크의 경우 그릇).다른 테이블에서 가져온 모든 정보는 필요에 따라 또는 필요할 때 가져옵니다.
느린 가져오기는 상위 개체를 로드하는 동안 하위 개체를 로드할지 여부를 결정합니다.이 설정은 부모 클래스의 휴지 상태 매핑파일 각각에 대해 수행해야 합니다. Lazy = true
(자녀를 로드하지 않음) 기본적으로는 자식 개체의 느린 로드는 True입니다.
, 으로 호출되지 한, 자되지 않는 것을 확인합니다.자 는, 「」를 호출해 주세요.getChild()
메서드를 사용합니다.은 새로운 합니다.getChild()
어버이
그러나 경우에 따라서는 부모가 로드될 때 하위 개체를 로드해야 합니다.lazy=false로 만들면 부모가 데이터베이스에서 로드될 때 최대 절전 모드로 전환됩니다.
예: TABLE ? EMployee 객체가 Employee 객체에 매핑되어 Address 객체 세트가 포함되어 있는 경우.부모 클래스: 직원 클래스, 자식 클래스: 주소 클래스
public class Employee {
private Set address = new HashSet(); // contains set of child Address objects
public Set getAddress () {
return address;
}
public void setAddresss(Set address) {
this. address = address;
}
}
Employee.hbm.xml 파일
<set name="address" inverse="true" cascade="delete" lazy="false">
<key column="a_id" />
<one-to-many class="beans Address"/>
</set>
상기의 설정에서는.한다면lazy="false"
: - Employee 객체를 로드하면 해당 시간 자녀 객체의 주소도 로드되고 setAddress() 메서드로 설정됩니다.employee.getAddress()를 호출하면 로드된 데이터가 반환됩니다.신규 데이터베이스 호출이 없습니다.
한다면lazy="true"
:- 이것은 기본 설정입니다.언급하지 않으면 휴지 상태를 lazy=true로 간주합니다.시간 하위 개체 주소가 로드되지 않은 경우 Employee 개체를 로드합니다.주소 개체를 가져오려면 데이터베이스에 대한 추가 호출이 필요합니다.전화하시면employee.getAdress()
그러면 데이터베이스 쿼리가 기동되어 결과가 반환됩니다.신규 데이터베이스 호출
로딩이 느리다고요?이것은 단순히 자녀 레코드가 즉시 가져오는 것이 아니라 액세스하려고 하면 자동으로 가져오는 것을 의미합니다.
로딩이 느리면 연결 검색을 연기하거나 가져오기 전략을 더 잘 제어할 수 있습니다.
Eager 로드를 사용하는 경우 쿼리 시 재정의할 수 없는 글로벌 가져오기 계획을 정의합니다. 즉, 엔티티 모델을 설계하는 동안 내린 결정으로 제한됩니다.가져오기 전략은 쿼리 시간 정책이며 비즈니스 사용 사례에 따라 다를 수 있기 때문에 OVER 가져오기는 코드 냄새입니다.
가져오기 전략은 매우 중요한 측면입니다. 너무 많은 열망을 가져오면 성능과 관련된 심각한 문제가 발생할 수 있습니다.
느린 설정은 상위 개체를 로드하는 동안 하위 개체를 로드할지 여부를 결정합니다.이 설정은 부모 클래스의 휴지 상태 매핑파일 각각에 대해 수행해야 합니다.Lazy = true(자녀를 로드하지 않음)기본적으로는 하위 개체의 느린 로드는 True입니다.이를 통해 부모 상에서 getChild() 메서드를 호출하여 응용 프로그램에서 명시적으로 호출되지 않는 한 자식 개체가 로드되지 않도록 합니다.이 경우 hibernate는 getChild()가 Parent 객체에 정상적으로 호출되었을 때 새로운 데이터베이스 호출을 발행하여 아이를 로드합니다.그러나 경우에 따라서는 부모가 로드될 때 하위 개체를 로드해야 합니다.lazy=false로 만들면 부모가 데이터베이스에서 로드될 때 최대 절전 모드로 전환됩니다.예: lazy=true(기본값)사용자 클래스의 주소 자식은 자주 필요하지 않을 경우 지연될 수 있습니다.vp=false그러나 온라인 서점에서 책을 취급할 때마다 Book parent의 Author 객체를 로드해야 할 수도 있습니다.
느린 로딩은 일반적으로 컴퓨터 프로그래밍에서 오브젝트가 필요한 시점까지 오브젝트의 초기화를 지연시키기 위해 사용되는 설계 패턴입니다.적절하고 적절하게 사용한다면 프로그램 운영의 효율성에 기여할 수 있다.
위키백과
hibernate.org에서 Lazy Loading 링크
즉, 현재는 사용하지 않는 데이터 전체를 한꺼번에 로드하는 것이 아니라 현재 필요한 데이터를 로드하는 것입니다.이것에 의해, 애플리케이션의 로딩 시간이 통상보다 단축됩니다.
놀랍게도, 어떤 대답도 스크린 뒤에서 동면함으로써 어떻게 그것이 달성되는지에 대해서는 언급하지 않았다.
느린 로딩은 성능상의 이유로 하이버네이션에서 효과적으로 사용되는 설계 패턴으로, 다음과 같은 기술을 사용합니다.
1. 바이트 코드 계측:
그 엔티티 오브젝트에 대한 모든 콜을 대행 수신할 수 있도록 하이버네이트 후크를 사용하여 베이스 클래스 정의를 확장합니다.
컴파일 시 또는 실행 시(로드 시) 중 하나
1.1 컴파일 시간
컴파일 시간 후 작업
대부분 메이븐/앤트 플러그인에 의한
1.2 실행 시간
- 컴파일 시 instrumentation이 수행되지 않은 경우 javassist와 같은 라이브러리를 사용하여 런타임에 생성됩니다.
휴지 상태가 반환하는 엔티티 개체는 실제 유형의 프록시입니다.
'Javassist'도 참조해 주세요. 주요 아이디어는 무엇이고 실제로 어디에 사용되는가?
Hiberante는 엔티티와 컬렉션 모두에 대해 느린 초기화 기능을 지원합니다.휴지 상태 엔진은 쿼리 대상 개체만 로드하고 다른 엔티트나 수집은 로드하지 않습니다.
lazy="false"는 기본적으로 유일한 하위 항목에 대한 로드 초기화 설명으로, lazy.in의 경우 로드 중인 상위 항목이 하위 항목을 지원하지 않습니다.
느린 설정은 상위 개체를 로드하는 동안 하위 개체를 로드할지 여부를 결정합니다.이 설정은 부모 클래스의 휴지 상태 매핑파일 각각에 대해 수행해야 합니다.Lazy = true(자녀를 로드하지 않음)기본적으로는 하위 개체의 느린 로드는 True입니다.
언급URL : https://stackoverflow.com/questions/2192242/what-is-lazy-loading-in-hibernate
'programing' 카테고리의 다른 글
C 컴파일러는 어떻게 구현합니까? (0) | 2022.07.18 |
---|---|
Vue는 사용하기 전에 소품에서 데이터를 기다립니다. (0) | 2022.07.18 |
OSGi는 무엇을 해결합니까? (0) | 2022.07.18 |
String Builder를 지우거나 비우려면 어떻게 해야 합니까? (0) | 2022.07.18 |
날짜를 해석하는 방법? (0) | 2022.07.18 |