2011-03-22 2 views
1

테이블 로딩/리로딩 로직을 구현하는 TableHandler가 있습니다. 테이블이란 사용자가 테이블 개체의 형태로 디스크 또는 메모리에서 요청할 때 디스크 또는 메모리에서로드하는 데이터를 의미합니다. 새 요청이 도착하고 테이블의 인스턴스가 메모리에있는 경우 메모리에서 테이블을로드하고 디스크에서 테이블을 다시로드하지 않습니다. 찾고있는 테이블이 메모리에 없으면 디스크에서 테이블을로드합니다. 지금 내 요청이 늘어나면서 많은 테이블이 메모리에 저장되어 5 분 동안 초과되지 않은 5 분을 말한 후 메모리에서 일부 테이블을 자동으로 릴리스하려고합니다. 어떻게 구현할 수 있습니까? 는이 같은 tablehandler 클래스 구조가자동으로 5 분 후 같은 방법으로 메모리에서 데이터 테이블을 해제하는 방법

final class TableHandler{ 

    /* 
    Data struct for storing information required for management 
    of the loaded table instances 
    */ 

    final static class Tableinfo{ 

     /* 
     Table instance.. and other things like table when 
     last modified and whether to referench the table 
     when a next request arrives. 
     */ 

    } 

    getTable(){someInternalTableHandler.getTable()} 

    replacetable {someInternalTableHandler.replacetable()} 

    //Handles loading/reloading logic. 

    final static class someInternalTablehandler{ 

     getTable(){...} 
     createTableInstance(){...} 
     replaceTable{...} 

    } 
} 

어떻게 위를 구현하는 내 코드에 로직을 말했다 수 있습니다 .... ??

답변

0

당신은이 작업을 수행 할 구아바지도 작성기를 사용할 수 있습니다 http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/MapMaker.html

Map map = new MapMaker().expireAfterWrite(5, TimeUnit.MINUTES).makeMap(); 

을 한 번에 하드 코드가하지 않으려면 생성 된지도에 값 소프트 참조를 사용할 수 있습니다. 이렇게하면 더 이상 참조되지 않고 JVM의 메모리가 부족한 경우 맵 값이 삭제됩니다.

자체/약한 참조를 사용하여 자신을 지우는지도를 굴리는 일도 그리 어렵지 않습니다.ReferenceQueue, WeakReference 한 번 봐, 그리고 SoftReference

캐시 및 참조 될 때 더 이상 삭제됩니다 당신이 @Cache와 방법 및 그 방법의 모든 반환 값에 주석을 달 수 있도록 일부 프로젝트가있다. http://code.google.com/p/tantalizing-eats/

1

두 가지 옵션 :

  1. 당신의 목표는 중복 요청은 결국 새로운 데이터를 볼 수 있도록 데이터를 갱신하는 경우

    . 그런 다음 데이터를 마지막으로 가져 왔을 때의 Tableinfo 클래스에 Date를 추가하십시오. 그런 다음 날짜가 최근 5 분 이내 인 경우에만 메모리에서 사본을 사용하십시오.
  2. 목표가 메모리 사용을 줄이고 테이블이 많은 경우 5 분 후에 메모리에서 테이블을 제거하는 TimerTask를 실행하는 새 Timer를 만듭니다.
+0

나는 이미 tableinfo에서 마지막으로 수정 한 것과 같은 타임 스탬프 필드가 있습니다 ...하지만 타이머 작업을 구현하는 방법은 무엇입니까? ?? 코드가 좋을 것입니다 ... –

+0

테이블 데이터를 지우는 구현으로 TimerTask를 확장하십시오 . 작업을 예약하려면 http://download.oracle.com/javase/6/docs/api/java/util/Timer.html을 사용하십시오. – jzd

2

정확하게 메모리의 테이블 캐시와 같습니다. 이 문제를 해결하는 EHCache와 같은 자바 캐싱 솔루션을 살펴보십시오.

직접 해보려면 Tableinfo 클래스에 타임 스탬프를 추가하여 마지막 액세스 시간을 저장하십시오. 그런 다음 jzd가 "언로드"해야하는 테이블을 찾아 TableInfo 목록을 탐색하도록 제안하는 타이머 작업을 사용하십시오. 내가 제대로 이해 해요 경우 타이머와 TimerTask를

+0

나는 이미 tableinfo에서 마지막으로 수정 한 것과 같은 타임 스탬프 필드를 가지고 있습니다 ...하지만 타이머 작업을 구현하는 방법은? ?? 코드는 훌륭합니다 ... –

0

를 사용하는 예를 들어

확인 herejava.lang.ref.WeakReferencejava.lang.ref.SoftReference 클래스는 당신이 찾고있는 무슨 수 있습니다.

약한 참조 만 있으면 객체에 대한 모든 참조를 해제 한 것처럼 동작하므로 원하는 경우 언제든지 GC에 의해 정리할 수 있습니다. GC가 테이블을 지우지 않았다면 테이블을 지울 수 있습니다. 정리 한 경우 테이블을 다시로드해야합니다. 소프트 참조는 비슷하지만 개체가 일반적으로 오래 유지되며 메모리가 부족한 경우에만 마무리됩니다.

5 분 동안 사용하지 않아도되는 것과 같은 보증을 원한다면 타사 라이브러리를 사용해야하거나 직접해야합니다. 내장 클래스가 제공하지 않습니다.

관련 문제