2016-12-27 5 views
0

데이터베이스 엔티티가있는 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) 캐시에서 어떤 일이 일어나는지 디버깅하려면 어떻게해야합니까? 부모를 퇴거 시켰습니까? 또는 모든 아이들? 이 기사에서 설명한 것처럼 전체 컬렉션을 다시로드합니다.

답변

0
  1. 캐시 사용 = "읽기 - 쓰기"를 캐시 사용 = "읽기 전용"으로 변경 한 다음 코드에서 퇴거 정책을 유지 관리 할 수 ​​있습니다. 이것은 캐시를 관리하는 가장 안전한 방법이지만 캐시를 관리하기위한 코드가 많이 필요합니다.

  2. 디버깅에는 2 가지 방법이 있습니다.

    1. 는 최대 절전 모드에서 show_sql을 활성화하고 쿼리가 일반적으로 개체에 대해 먼저 캐시를 확인하려 최대 절전 모드 및 발견하지 않았고, 두 번째 쿼리 데이터베이스 방식으로 전송 표시되는, 두 번 실행지고 있는지 확인합니다.
    2. 로그 캐시로이 문서에 설명 안타 : http://winterbe.com/posts/2009/10/01/how-to-log-hibernate-cache-this/
+0

감사합니다! '퇴거 정책 유지'란 정확히 무엇을 의미합니까? – codesmith

+0

캐시 사용 = "읽기 - 쓰기"를 넣으면 hibernate가 객체 제거를 처리합니다. session.save/update를 사용하여 객체를 업데이트하자마자 캐시에서 캐시 된 객체를 제거합니다. 하지만 Read는 최대 절전 모드로이를 수행 할 수 없으므로이를 처리하기 위해 프로그래밍 방식으로 캐시 제거를 코드에 작성해야합니다. – user1622369

관련 문제