데이터베이스 엔티티가있는 Java/Spring 애플리케이션이 있습니다. 엔티티 중 하나가 DataSet
입니다. 각 DataSet에는 부모 DataSet
이있을 수 있습니다. 그리고 부모 - DataSet
에는 여러 개의 (OneToMany) 하위 항목이 있습니다.컬렉션 최대 절전 모드로 캐싱
@OneToMany(fetch=FetchType.LAZY)
@IndexColumn(name = "order_id")
@JoinColumn(name = "parent_dst_id")
@Fetch(FetchMode.SELECT)
@Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE)
public List<DataSet> getChildren()
{
return children;
}
몇 년 후에 많은 DataSets가 일부 상위 DataSets 아래에 그룹화되었습니다. 코드에서
parentDataset.getChildren().size() // > 200.000
(이것은 올바른 방법이 있는지 확실하지 않습니다) 부모에 새로운 데이터 세트 (설문 조사)를 추가 할 때 다음 줄이 실행됩니다 최근까지
surveyDataset.setParent(parentDataset);
parentDataset.getChildren().add(surveyDataset);
을 children
은 전혀 캐시되지 않았습니다. 그런 다음 두 번째 명령문은 데이터베이스에 대해 장기 실행 쿼리를 작성했습니다.
최근에 우리는 캐시에 datasets.children
을 추가했습니다. 그렇게하면 모든 것이 정말 빨라집니다. 까지
...
.. 다른 아이 데이터 세트가 추가됩니다 그것은 다시 정말 느린됩니다 (같은 부모 아래에!) (예 : 그것은 다시 DB를 쿼리 시작).
캐시가 퇴거 당하거나 삭제 된 것으로 생각되며 다시 쿼리하는 이유입니다.
도 참조 : http://planet.jboss.org/post/collection_caching_in_the_hibernate_second_level_cache은 (가 TLDR는 "최대 절전 모드가 캐시에 컬렉션을 업데이트하지 않습니다, 단지 그것을 제거합니다.")
내가 (net.sf.ehcache = DEBUG 로깅 이해하기 위해 노력하고 org.hibernate.SQL = DEBUG) 그러나 그것은 어렵다.
그래서 나는 다시 새로운 데이터 세트에서 (모든 형제 자매) 모든 아동 데이터 집합을로드 방지하기 위해해야 할 일을 몇 가지 질문에
1)와 붙어있어? 2) 캐시에서 어떤 일이 일어나는지 디버깅하려면 어떻게해야합니까? 부모를 퇴거 시켰습니까? 또는 모든 아이들? 이 기사에서 설명한 것처럼 전체 컬렉션을 다시로드합니다.
감사합니다! '퇴거 정책 유지'란 정확히 무엇을 의미합니까? – codesmith
캐시 사용 = "읽기 - 쓰기"를 넣으면 hibernate가 객체 제거를 처리합니다. session.save/update를 사용하여 객체를 업데이트하자마자 캐시에서 캐시 된 객체를 제거합니다. 하지만 Read는 최대 절전 모드로이를 수행 할 수 없으므로이를 처리하기 위해 프로그래밍 방식으로 캐시 제거를 코드에 작성해야합니다. – user1622369