2012-08-17 2 views
1

키 또는 ID로 엔티티를로드하고 저장하는 데 간단한 레이어를 사용하고이 레이어에 캐싱을 추가했습니다. 주어진 키가있는 엔티티가 캐시에 있으면 데이터 스토어에서 페치하지 말고 리턴하십시오. 엔티티가 업데이트되어 데이터 저장소에 저장되면 계층은 단순히 캐시의 엔티티를 null로 설정합니다. 완전히 투명합니다.GAE, JDO : 캐시에서로드 된 엔티티로 작업하기

캐시에서 가져온 개체가 데이터 저장소에서 가져온 개체와 약간 다르지만 제대로 작동하는 것 같습니다. 예를 들어 어떤 것들은 작동을 멈췄습니다. 엔티티 내부의 Collections에 .contains()를 사용하여 두 엔티티 사이에 관계가 있는지 여부를 확인할 수 없습니다. 캐시에서 객체를로드하고 데이터 저장소에 저장 한 직후 관계를 나타내는 콜렉션의 모든 항목이 null으로 바뀌는 이상한 동작이 발생했습니다. 그러나 나는 그것을 재현 할 수 없었다. 이제 제대로 작동합니다.

나는 두포에서 무슨 일이 일어나고 있는지 모르겠다. 그래서 문제는 캐시를 신뢰할 수있는 방법인가? 캐시에서 가져온 엔티티를 데이터 저장소에서 가져온 것과 같이 작업 할 수 있습니까 (하위 항목 액세스, 업데이트, 제거 ...)?

답변

3

두 가지 참고 사항 : Memcache를에 저장

  1. 모든 객체가 메모리 표현 바이트 (반대의 경우도 마찬가지)의 일련의 촬영 및 변경을 의미 serialized/deserialized를 얻을.

  2. Collection.contains(object)object.equals(anotherObject)을 사용하여 컬렉션에 특정 개체가 포함되어 있는지 확인합니다. 이것이 exact same object (= 동일한 메모리 위치에있는 객체) 인 경우 기본적으로 Object.equals()true입니다.

주어진 : 오브젝트를 직렬화 한 후이 deserialisedObject.equals(originalObject) == true을 제공하는 개체를 만들하지 않습니다 직렬화 복원.

.equals() (및 .hashCode())을 Memcache에 저장하는 클래스에서 재정의해야하므로 실제로 클래스의 의미있는 값 (모든 필드의 값 비교)을 비교해야합니다.

+0

'Collection.contains (object)'가 어떻게 작동하는지 설명해 주셔서 감사합니다. 객체가 직렬화/역 직렬화되는 것을 알았지 만 이것이 원인인지는 몰랐습니다. 알고 있어야 할 다른 것이 있습니까? 원래의 질문을 반복하려면 (물론 실체가 오래된 것일 수도 있음) 데이터 저장소에서 가져온 것처럼 캐시 된 엔터티를 사용할 수 있습니까? – tobik

+0

이 경우 엔 엔티티가 POJO입니까? 그렇다면 예, 제대로 직렬화되었는지 확인하고 데이터 저장소에서 온 것처럼 사용할 수 있습니다. 그러나 설명대로 그들을 비교하십시오. –

+1

예, 그렇습니다. @PersistenceCapable 주석을 사용하여 승격 된 간단한 클래스. 그게 좋은 소식입니다. 고마워요. 그리고 제안한대로 equals() 및 hashCode() 메서드를 재정 의하여 이제 원하는 방식으로 비교할 수 있습니다. – tobik