문제

최대 절전 모드 지속성 매핑과 함께 플라이급 객체를 사용하는 방법이 있습니까? 내 데이터 모델에는 동일 할 많은 객체가 포함되어 있습니다. 동일한 개체 각각에 대해 별도의 인스턴스를 갖는 대신 Flyweight 디자인 패턴을 사용하고 항상 동일한 물리적 객체를 참조하고 싶습니다. 최대 절전 모드에서 이것을 달성하는 방법?

BTW. 모든 JVM이 동일한 문자열이 여러 번 사용될 때 항상 동일한 물리적 인스턴스가 될 수 있도록 문자열 사용을 최적화합니까?

도움이 되었습니까?

해결책

때에 따라 다르지.

Readonly를 위해 가치 매번 새로운 인스턴스 대신 풀에서 객체를 반환하는 사용자 정의 사용자 유형을 만들어 플라이급 패턴을 쉽게 구현할 수 있습니다.

엔티티의 경우 최대 절전 모드는 기본적으로 제정신이며 트랜잭션에서 일관되기를 원하므로 데이터의 레이스 조건을 피하기 위해 세션간에 엔티티를 공유하지 않습니다. 저는 그것이 원하는 것이라고 생각하지 않습니다.

그러나 (그리고 이것은 당신이 무엇을하고 있는지 알지 못하고 전혀 권장하지 않는 경우), 당신은 2 단계 캐싱을 위해 의도 된 interceptor.getentity ()를 구현할 수 있습니다. 이 방법에서는 엔티티 (다른 세션에서 공유 한 일부)를 반환 할 수 있으며 엔티티에 효과적으로 플라이급 패턴이 있습니다.

그러나 데이터의 일관성에 대해서는 이에 대해 적극 권장합니다. 실제 엔티티를 시도하고 플라이급보다 실체가 참조하는 실제 불변의 플라이급 값을 갖는 것이 훨씬 좋습니다.

다른 팁

예, 최대 절전 모드로 플라이급 패턴을 구현할 수 있습니다.

플라이급 패턴은 메모리 사용량을 최소화하는 방법입니다 인스턴스 당. 전략은 가능한 한 플라이급 인스턴스간에 많은 상태를 공유하는 것입니다. 귀하의 경우 공유 상태는입니다 최대 절전 모드 객체 식별자를 제외한 모든 것과 객체 아이덴티티를 유지하기위한 일부 추가 상태.

각 플라이급 인스턴스에는 자체가 필요합니다 객체 아이덴티티. 추가 상태는 공통 상태를 공유하는 객체를 구별하기 위해 신원을 구현하는 방법입니다.

public boolean equals(Object obj){
  Fly other; [..]//check type
  //null checks ommitted
  return other.myState.equals(myState) && other.commonState.equals(commonState); 
}

인스턴스간에 객체 아이덴티티가 공유되는 경우 최대 절전 모드는 모든 물리적 인스턴스 (참조)를 동일한 인스턴스로 해석합니다. Hibernate는 Equals 메소드를 사용하여 객체 아이덴티티를 확인하고 동등한 구현이 반환되어야합니다. (! a.equals(a) == true) 불법입니다. 동일한 반사적이어야합니다. 이 계약을 위반하면 계약에 따라 달라지는 모든 라이브러리가 파손됩니다 (수집, 최대 절전 모드 등).

최대 절전 모드 객체 식별자를 사용하여 동일한 방법을 구현할 수 없습니다. 물체를 구별하기 위해. 이것은 객체 정체성이 지속성 상태 (지속 또는 일시적)에 의존하게 만듭니다.

최대 절전 모드에서 공통 상태를 모델링하는 한 가지 방법은 공유 상태 객체와 플라이급 객체 사이의 일대일 연관성입니다. (누군가가 두 개의 테이블에 결합하지 않고 데이터를 매핑하는 방법이 있습니까?)

문자열 : 만 내재화 된 문자열 공유됩니다. 이것은 대부분 최고의 솔루션이 아닙니다. 기호 (클래스 이름, 메소드 이름 등)에 적합합니다. 내재화 된 줄은 쓰레기로 수집되지 않으며 어쨌든 쓰레기를 수집 할 문자열 인스턴스가 있어야합니다. new String("..").intern(). 할당을 저장하지 않습니다. 기본 문자열이 GC 생성에서 살아남지 못하거나 스택에 할당 될 수 있다는 사소한 이점 만 있습니다 (핫 스팟에서 탈출 분석을 가능하게하고 적용 할 수 있음).

모든 JVM이 동일한 문자열이 여러 번 사용될 때 항상 동일한 물리적 인스턴스가 될 수 있도록 문자열 사용을 최적화합니까?

나는 그것을 매우 의심합니다. 동일한 클래스 파일에서 다음과 같이 정의 될 때

String s1 = "Yes";
String s2 = "Yes";

아마 S1 == S1이있을 것입니다.

그러나 당신이 좋아한다면 :

String x = loadTextFromFile(); // file contains es
StringBuilder b = new StringBuilder();
s2 = b.append("Y").append(x).toString(); // s2 = "Yes"

런타임이로드 된 모든 문자열을 빌더의 반환 값과 확인하고 비교할 것이라고 생각하지 않습니다.

따라서 항상 객체를 equals ()와 비교하십시오. 어쨌든 그것은 모든 좋은 평등이 시작되기 때문에 좋은 조언입니다.

if (this == o) {
    return true;
}

객체가 정체성으로 평등을 구현하는 경우 최대 절전 모드는 해당 기본 키와 관련된 단일 인스턴스 만 갖습니다. 나는 그것이 Flyweight와 똑같은 아이디어라고 생각하지 않지만 요점은 동일한 최대 절전 모드의 인스턴스가 많지 않다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top