2011-11-23 5 views
2

우리는 우리는 데이터베이스 또는 RPC 호출에서 올 수있는 데이터 소스 때문에 이러한 서비스를 캐싱 프록시를 생성 한 다음효율적인 데이터 구조는

interface StructureService { 
    void create(FileEntry entry, EntryType type) throws IOException; 
    Collection<FileEntry> getChildren(FileEntry entry) throws IOException; 
    void delete(FileEntry entry) throws IOException; 
    void rename(FileEntry file, FileEntry newFile) throws IOException; 
    void copy(FileEntry source, FileEntry destination) throws IOException; 
    EntryType getType(FileEntry entry); 
    long getLastModified(FileEntry entry) throws IOException; 
    long getSize(FileEntry entry) throws IOException; 
} 

과 같은 서비스 계층을 .

현재 캐시 구현은 수정 작업 후에 전체 캐시를 지우고 다시 작성합니다. 이로 인해 통화를 동기화하여 해결할 수있는 경쟁 조건이 발생했습니다. 그러나 이것은 매우 비효율적입니다.

대신 각 작업의 구조를 수정하고 싶습니다.

이 시나리오에서 도움이 될 수있는 양호한 Java 구현 방법이 있는지 궁금합니다.

우리는 Google 앱 엔진에 memcache를 백엔드로 사용하므로 키 - 값 쌍이있는 각 항목을 저장하면 도움이됩니다.

답변

1

구조가 폴더/파일 트리 인 경우 루트에서 리프까지 잠금을 획득 한 다음 작업을 실행하십시오. 각 항목에 대해 ReadAndWriteLock을 사용하십시오.

읽고 계시는 분은 readlock을 사용하십시오. 쓰는 경우에는 중간 부모 및 항목 자체를 제외하고 부모에 대한 읽기 잠금을 사용하십시오. 그들과 쓰기 잠금을 사용하십시오.

무언가를 얻으면 (필요한 경우 생성) 잠금을 얻고 (캐시에 없으면 읽음) 데이터를 가져 와서 잠금을 해제하십시오.

부모를위한 읽기 잠금을 획득하고 수정되는 항목에 대한 쓰기 잠금 만 획득하면 수정시 동시 액세스가 가능하지만 올바르게 잠글 수 있습니다.

샘플

업데이트/A/B/C/

lock for a - grab read lock 
lock for b - grab read lock 
lock for c - gran read lock 
lock for d - grab write lock 

생성// A/B/C/D

lock for a - grab read lock 
lock for b - grab read lock 
lock for c - gran **write** lock // you are modifying c's list of files 

리스트/A/B를 삭제 D/c/d

lock for a - grab read lock 
lock for b - grab read lock 
lock for c - gran read lock 
lock for d - grab read lock 

참고

저는 GAE에서 이것을 구현하는 가장 좋은 방법이 무엇인지 모릅니다. 모든 항목에 대해 고유 한 잠금이있는 경우 작동합니다. GAE 사건에서 ... 당신이 그걸 가질 수 있는지 모르겠습니다.

+0

그래, 이건 구글 앱 엔진에서 구현하기 힘들 것 같아. 그런 식으로 memcache에서 통화를 동기화 할 수 없습니다. 그래도 좋은 답변을 주셔서 감사합니다! – jontro

+0

@Bengt : 고마워요 – helios

+0

음 ... 자물쇠로 임의의 개체를 사용하고 있다면 ... 임의의 ReadWriteLocks를 사용할 수 있습니다 ... 어떤 동기 개체가 있다면 (sync ' 에드 방법 또는 정적 개체 동기화), 당신은 비슷한 것을 사용할 수 있습니다. 그러나 나는 유일한 과정이 위험하다고 생각한다. 그리고 이러한 종류의 잠금은 JVM/ClassLoader에 국한됩니다. – helios

관련 문제